【问题标题】:nix-env: understading available attribute paths in the active Nix expressionnix-env:了解活动 Nix 表达式中的可用属性路径
【发布时间】:2019-06-12 20:46:09
【问题描述】:

在我的 NixOS 机器上,我可以通过两种方式使用nix-env 查询ghc 包:

一个是nix-env -f '<nixpkgs>' -qaP ghc 导致输出

ghc  ghc-8.6.5

另一个是nix-env -qaP ghc 导致输出

nixpkgs.ghc  ghc-8.6.5

对于第二种情况,我想了解为什么活动的 Nix 表达式具有 nixpkgs 根属性。

~/.nix-defexpr文件夹和几个子文件夹的内容如下:

活跃的 Nix 表达式是如何从~/.nix-defexpr 的内容中组装而成的?为什么没有 channels 根属性? nixpkgs 根属性的名称是从 nixpkgs 文件夹的名称派生而来,还是从文件夹的内容派生而来,可能是从 default.nix 文件中声明的内容派生而来?

【问题讨论】:

  • 很棒的侦探作品,这些例子很有教育意义!这让我困惑了多年,我还是顺其自然,但现在我明白了发生了什么。

标签: nix


【解决方案1】:

Nix manual 有一些关于如何组装.nix-defexpr 的信息:

此目录中的 Nix 表达式组合成一个集合, 将每个文件作为具有文件名的属性。

但它没有提到如果内容本身是目录会发生什么。但我发现 this GitHub issue 解释得更多:

  • 如果目录是有效的表达式(即具有 default.nix),则其表达式将被添加到集合中,否则将被遍历 递归。
  • 中间目录的名称被完全忽略(即不参与 attrpaths)。
  • manifest.nix 被递归忽略。

因此,没有 channels 根属性,因为文件夹没有 default.nix 表达式。

好的。然后,作为一个实验,我创建了一个文件夹.nix-defexpr/foo,其中包含一个文件default.nix,其中的内容为{ zzz = 4; }。当我执行nix-env --install -A foo.zzz 时,我得到:

error: expression does not evaluate to a derivation (or a set or list of those)

这意味着它实际上找到了路径!问题是4 不是派生的。

但是如果我创建另一个文件夹 .nix-defexpr/whatever 并将文件夹 foo 的副本放在那里呢?不会有某种名称冲突吗?是的,有:

8f792ff4f96a:~# nix-env --install -A foo.zzz
warning: name collision in input Nix expressions, skipping '/root/.nix-defexpr/whatever/foo'

【讨论】:

    猜你喜欢
    • 2011-03-20
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2020-02-03
    • 1970-01-01
    • 2017-11-28
    • 2019-11-22
    相关资源
    最近更新 更多