如何列出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
相关产品推荐
相关产品推荐

