不构建Nix表达式如何知道构建计划和存储路径?
How to know the build plan and store path without building a Nix expression?
nix-build ... --no-out-link
给出了 Nix 商店中的路径。
是否可以在不实际构建表达式的情况下找出该路径?
是否可以在不构建表达式的情况下找出依赖项和计划的构建操作?
我怎样才能自己找到答案?
man nix-store
有答案,特别是 --query
部分。
要知道输出路径:
nix-store -q --outputs $(nix-instanciate default.nix)
了解构建时的依赖关系:
nix-store -qR --include-outputs $(nix-instanciate default.nix)
至于构建计划,我越接近使用 --tree
标志。
请注意,nix-shell
也公开了一个 $out
变量,因此第一个要点的另一种可能解决方案是:
nix-shell --pure --run 'echo $out' some-file.nix
Nix manual, "Building and testing" section refers to nix-build
文档,在最后 "Description" 段中提到它是 nix-instantiate
和 nix-store -r
的组合。
nix-instantiate
不构建。它只计算计划,形式为推导及其闭包:
$ nix-instantiate '<nixpkgs>' -A hello
warning: you did not specify '--add-root'; the result might be removed by the garbage collector
/nix/store/20bc2g6gfn44p9wk98s30pm346pmz0x9-hello-2.10.drv
不过,我更喜欢使用 nix repl
来探索 Nix 表达式:
$ nix repl '<nixpkgs>'
Loading '<nixpkgs>'...
Added 8623 variables.
nix-repl> hello.outPath
"/nix/store/nic2bl8ry6vfyxr9717983d5b2l4sn1c-hello-2.10"
它的制表符完成功能在探索表达式时非常有帮助。
nix-build ... --no-out-link
给出了 Nix 商店中的路径。
是否可以在不实际构建表达式的情况下找出该路径?
是否可以在不构建表达式的情况下找出依赖项和计划的构建操作?
我怎样才能自己找到答案?
man nix-store
有答案,特别是 --query
部分。
要知道输出路径:
nix-store -q --outputs $(nix-instanciate default.nix)
了解构建时的依赖关系:
nix-store -qR --include-outputs $(nix-instanciate default.nix)
至于构建计划,我越接近使用 --tree
标志。
请注意,nix-shell
也公开了一个 $out
变量,因此第一个要点的另一种可能解决方案是:
nix-shell --pure --run 'echo $out' some-file.nix
Nix manual, "Building and testing" section refers to nix-build
文档,在最后 "Description" 段中提到它是 nix-instantiate
和 nix-store -r
的组合。
nix-instantiate
不构建。它只计算计划,形式为推导及其闭包:
$ nix-instantiate '<nixpkgs>' -A hello
warning: you did not specify '--add-root'; the result might be removed by the garbage collector
/nix/store/20bc2g6gfn44p9wk98s30pm346pmz0x9-hello-2.10.drv
不过,我更喜欢使用 nix repl
来探索 Nix 表达式:
$ nix repl '<nixpkgs>'
Loading '<nixpkgs>'...
Added 8623 variables.
nix-repl> hello.outPath
"/nix/store/nic2bl8ry6vfyxr9717983d5b2l4sn1c-hello-2.10"
它的制表符完成功能在探索表达式时非常有帮助。