2017-09-09 6 views
0

De Section 12.5 of Nix Pills:la difficulté à comprendre avec la déclaration Nix Expression

Terminer l'expression de graphviz avec l'aide de la masse (GD note l'utilisation de la avec l'expression dans buildInputs pour éviter de répéter pkgs):

let 
    pkgs = import <nixpkgs> {}; 
    mkDerivation = import ./autotools.nix pkgs; 
in mkDerivation { 
    name = "graphviz"; 
    src = ./graphviz-2.38.0.tar.gz; 
    buildInputs = with pkgs; [ gd fontconfig libjpeg bzip2 ]; 
} 

Pourquoi le with pkgs est nécessaire à la fin de l'extrait de code dans buildInputs? Je pensais que pkgs était déjà dans la portée de la liaison let en haut?

Répondre

1

Oui, pkgs est dans la portée, mais cela ne met pas automatiquement ses attributs dans la portée.

pkgs est un ensemble contenant des attributs tels que Nix gd, fontconfig ... Si vous déposez with pkgs alors la liste des buildInputs ne sera pas en mesure de résoudre les attributs mentionnés ci-dessus. En utilisant votre exemple, les deux expressions suivantes sont sémantiquement identiques:

buildInputs = with pkgs; [ gd fontconfig libjpeg bzip2 ]; 

buildInputs = [ pkgs.gd pkgs.fontconfig pkgs.libjpeg pkgs.bzip2 ]; 

Voici un autre exemple qui est aussi sémantiquement:

let 
    pkgs = import <nixpkgs> {}; 
    mkDerivation = import ./autotools.nix pkgs; 
    gd = pkgs.gd; 
    fontconfig = pkgs.fontconfig; 
    libjpeg = pkgs.libjpeg; 
    bzip2 = pkgs.bzip2; 
in mkDerivation { 
    name = "graphviz"; 
    src = ./graphviz-2.38.0.tar.gz; 
    buildInputs = [ gd fontconfig libjpeg bzip2 ]; 
} 

Dans le dernier exemple, gd, fontconfig ... sont mis en portée dans la première partie de l'expression let, puis utilisé dans buildInputs sans le with pkgs.

J'espère que cela vous aidera à comprendre ce que fait with pkgs.