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

How to get "name" field out of nix expression?

鉴于以下 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;
}

如何使用 nix-instantiatename 字段中获取值 hello-2.1.1

$ nix-instantiate --eval -E 'name' default.nix 
error: undefined variable ‘name’ at (string):1:1

您的 nix-instantiate 调用正在执行的操作是尝试从几乎为空的范围中检索 name。这里缺少的是 NixPkgs 中实现的一项功能,它为 default.nix 中的函数提供了参数。

让我们从您当前的 <nixpkgs>:

中获取 callPackage 函数
(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"