如何从nix表达式中获取“name”字段?

时间:2017-08-28 09:26:26

标签: nix

考虑以下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.1name字段获取值nix-instantiate

$ nix-instantiate --eval -E 'name' default.nix 
error: undefined variable ‘name’ at (string):1: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"