使用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 pkgs
在buildInputs
的代码段末尾需要pkgs
?我认为let
已经在范围内通过顶部的FormData
绑定了吗?
答案 0 :(得分:1)
是的,Select Items Automatically
在范围内,但不会自动将其属性放入范围。
pkgs
是包含pkgs
,gd
等属性的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
正在做的事情。