2017-09-09 2 views
0

Von Section 12.5 of Nix Pills:Schwierigkeiten zu verstehen, mit dem Statement in Nix Expression

Beenden Sie den Ausdruck für graphviz mit gd Unterstützung (Note die Verwendung der mit der Expression in buildInputs Wiederholung pkgs zu vermeiden):

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 ]; 
} 

Frage: Warum ist die with pkgs am Ende des Code-Snippet inbenötigt? Ich dachte pkgs war bereits im Umfang durch die let Bindung an der Spitze?

Antwort

1

Ja, pkgs ist im Geltungsbereich, aber das bringt seine Attribute nicht automatisch in den Geltungsbereich.

pkgs ist ein Nichts Satz Attribute wie gd enthält, fontconfig ... Wenn Sie with pkgs dann die Liste der buildInputs fallen nicht in der Lage sein, die oben genannten Attribute zu lösen. Mit Ihrem Beispiel sind die beiden folgenden Ausdrücke semantisch identisch:

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

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

Hier ist ein weiteres Beispiel, das auch semantisch identisch ist:

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 ]; 
} 

Im letzten Beispiel gd, fontconfig ... werden in Rahmen gebracht im ersten Teil der let Expression, und dann in buildInputs ohne die with pkgs verwendet.

Hoffentlich hilft Ihnen das, was with pkgs tut.

Verwandte Themen