用Nix Expression中的语句理解

时间:2017-09-09 21:49:22

标签: nix

来自Section 12.5 of Nix Pills

  

使用gd支持完成graphviz的表达式(注意在buildInputs中使用with表达式以避免重复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 ];
}

问题:为什么with pkgsbuildInputs的代码段末尾需要pkgs?我认为let已经在范围内通过顶部的FormData绑定了吗?

1 个答案:

答案 0 :(得分:1)

是的,Select Items Automatically在范围内,但不会自动将其属性放入范围。

pkgs是包含pkgsgd等属性的Nix集...如果您放弃fontconfig,则with pkgs列表将不会能够解决上述属性。使用您的示例,以下两个表达式在语义上是相同的:

buildInputs

这是另一个在语义上相同的例子:

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

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

在上一个示例中,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 ]; } gd ...被纳入fontconfig表达式的第一部分的范围,然后在let中使用而没有buildInputs

希望这会帮助你直接了解with pkgs正在做的事情。