考虑以下default.nix
,
{ stdenv, fetchurl, perl }:
stdenv.mkDerivation {
name = "hello-2.1.1";
builder = ./builder.sh;
src = fetchurl {
url = ftp://ftp.nluug.nl/pub/gnu/hello/hello-2.1.1.tar.gz;
md5 = "70c9ccf9fac07f762c24f2df2290784d";
};
inherit perl;
}
如何使用hello-2.1.1
从name
字段获取值nix-instantiate
?
$ nix-instantiate --eval -E 'name' default.nix
error: undefined variable ‘name’ at (string):1:1
答案 0 :(得分:2)
您的nix-instantiate
调用正在尝试从大多数空范围中检索name
。这里缺少的是NixPkgs中实现的一项功能,在default.nix
中为您的函数提供了参数。
让我们从您当前的callPackage
获取<nixpkgs>
函数:
(import <nixpkgs> {}).callPackage
callPackage
需要两个参数,一个定义包的函数和一个覆盖属性集。您可以提供文件引用,而不是直接提供函数。
(import <nixpkgs> {}).callPackage ./. {}
现在让我们得到名字
((import <nixpkgs> {}).callPackage ./. {}).name
然后运行它
$ nix-instantiate --eval -E '((import <nixpkgs> {}).callPackage ./. {}).name'
"hello-2.1.1"
为了试验Nix,我更喜欢使用nix-repl
。它更容易使用,并有标签完成。
$ nix-env -iA nixpkgs.nix-repl
$ nix-repl
nix-repl> ((import <nixpkgs> {}).callPackage ./. {}).name
"hello-2.1.1"