You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何列出Nix中非纯派生(impure derivation)的所有实现?

问题

使用Nix 2.15.1版本,编写了标记为__impure=true的非纯派生(代码如下)。由于非纯特性,每次构建都会生成新的存储路径。仅知晓该派生的foo.nix文件时,执行nix realisation info --json -f foo.nix命令报错,想知道是否有解决办法,或是根本无法查询该派生在存储中的所有实现。

派生代码

let pkgs = import <nixpkgs> {};
 in
pkgs.stdenv.mkDerivation {
  name = "impure";
  __impure = true; # 标记该派生为非纯
  buildCommand = "date > $out";
}

构建输出示例

$ nix build --json -f foo.nix
[{"drvPath":"/nix/store/32pdpzaj793kg4q1paxc6bhzhnf93n8j-impure.drv","outputs":{"out":"/nix/store/pkiv6mw6cbivnj9cam44gb94q9lm6asq-impure"},"startTime":0,"stopTime":0}]
$ nix build --json -f foo.nix
[{"drvPath":"/nix/store/32pdpzaj793kg4q1paxc6bhzhnf93n8j-impure.drv","outputs":{"out":"/nix/store/h0q8z5lm0s1w6902kg16d1zfjdc5qhlx-impure"},"startTime":0,"stopTime":0}]

错误信息

error: cannot operate on an output of the unbuilt derivation 'sha256:ddffc26775f61118da8597d1f2f62c544ec92461b31b5b1075ed8689a7ee8292!out'
解决办法

可以通过**固定的派生文件(.drv)**来查询所有已有的实现,因为非纯派生的.drv路径是固定的(派生本身的定义是纯的,__impure仅标记构建过程非纯)。

方法1:自动获取drv路径并查询

先实例化派生得到.drv文件路径,再用该路径查询所有实现:

# 获取派生文件路径
DRV_PATH=$(nix-instantiate foo.nix)
# 查询该派生对应的所有实现
nix realisation info --json "$DRV_PATH"

方法2:直接使用已知的drv路径查询

如果已经知道派生的.drv路径(比如构建输出里的/nix/store/32pdpzaj793kg4q1paxc6bhzhnf93n8j-impure.drv),直接传入该路径即可:

nix realisation info --json /nix/store/32pdpzaj793kg4q1paxc6bhzhnf93n8j-impure.drv
原因说明

原来的nix realisation info --json -f foo.nix命令报错,是因为该命令会尝试直接解析表达式的输出路径,但非纯派生的输出没有固定的内容哈希,Nix无法将表达式直接关联到已有的构建产物。而.drv文件是固定的,它记录了派生的构建规则,通过它可以查询到所有基于该规则生成的实现。

内容的提问来源于stack exchange,提问作者danidiaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:01:29