我试图找出原因我无法nix-build
产生预期的输出。有没有办法检查哪些 nixpkgs 版本用于构建派生?nix-build --verbose
就像在某个时刻打印 nixpkgs 哈希值一样。
对于用例,请考虑{pkgs ? import ./nixpkgs.nix}
.你怎么知道无论某物pkgs
是否为该推导提供参数?如果派生最终是使用当前操作系统 nixpkgs 构建的,那么某些东西一定提供了参数pkgs
。如果它是用定义的 nixpkgs 构建的,nixpkgs.nix
那么它就是不是假如。手动找出属于哪一种情况将非常繁琐:
- 查看来自 nixpkgs 的派生的所有依赖项
- 对于每个依赖项,检查它在操作系统和
nixpkgs.nix
nixpkgs 版本中是否具有不同的哈希值 - 如果哈希值不同,请检查它来自哪个 nixpkgs 并得出结论,使用了 nixpkgs
- 如果哈希值相同,则继续
当然,如果所有依赖项哈希值在两个 nixpkgs 版本中都相同,这可能并不重要,但至少能够在不需要大量手动工作的情况下解决这个问题会很好。
站外欺骗。
答案1
询问nixpkgs
正在使用哪个nix-build
可能没有很好的定义,因为nixpkgs
它只是一个像任何其他变量一样的变量(可以从 url、本地文件、通道、简单的属性集获取它的值)。实际上,您甚至可以在同一个存储库中拥有 nixpkgs 的多个实例。您可以使用不同的方法找到 nixpkgs 版本:
方法一:如果您知道 nixpkgs 来自哪个频道(例如<nixpkgs>
),并且您只想检查您的频道指向哪个提交:
$ nix-instantiate --eval -E '(import <nixpkgs> {}).lib.version'
"22.11pre405560.2da64a81275"
(请注意,最后一个数字是 nixpkgs 的提交,您可以使用 来nix eval
代替nix-instantiate
,但据我所知,该接口并不是很稳定)
您还可以使用以下方式获取路径
$ nix-instantiate --eval -E '(import <nixpkgs> {}).path'
/nix/store/p5jayhh78vbq7kpw6p3m1s61g365zwam-nixos/nixos
方法二:对于更复杂的推导,您甚至不确定在哪里nixpkgs
定义,您可以使用以下命令像任何其他变量一样调试它buildins.trace
:
举一个更准确的例子,假设您的文件是:
{
pkgs ? import <nixpkgs> {}
}:
pkgs.hello
然后你可以使用以下命令检查 pkgs 的值:
{
pkgs ? import <nixpkgs> {}
}:
builtins.trace (pkgs.lib.version) pkgs.hello
当你编译时,你会得到这个,nixpkgs 的提交是2da64a81275
:
$ nix-build a.nix
trace: 22.11pre405560.2da64a81275
/nix/store/y4mxrg8c6l09lb2szl69vwl4f6441i5k-hello-2.12.1
更多调试功能请参见这里。
PS:不要忘记 nix 是一种懒惰的语言,只评估需要的东西。因此,如果未使用变量,则不会调用该变量上的跟踪
$ cat a.nix
{
pkgs ? import <nixpkgs> {}
}:
let
x = builtins.trace (pkgs.lib.version) 2; # <-- never needed
in
pkgs.hello
$ nix-build a.nix
/nix/store/y4mxrg8c6l09lb2szl69vwl4f6441i5k-hello-2.12.1
方法三:如果你想知道派生的所有依赖项并且不关心 nixpkgs 的版本(毕竟派生可能在内部调用给定的nixpkgs
,然后覆盖其输入):
$ nix show-derivation $(nix-instantiate default.nix)
{
"/nix/store/g6qkwa2xaq6i40cwl9bpjxi19m7q8121-hello-2.12.1.drv": {
"outputs": {
"out": {
"path": "/nix/store/y4mxrg8c6l09lb2szl69vwl4f6441i5k-hello-2.12.1"
}
},
"inputSrcs": [
"/nix/store/9krlzvny65gdc8s7kpb6lkx8cd02c25b-default-builder.sh"
],
"inputDrvs": {
"/nix/store/0na7ivzsc073j4kpn9kqnvd2zvwb8g0a-hello-2.12.1.tar.gz.drv": [
"out"
],
"/nix/store/1av43alhcb8a894sz2cnnf9aldfdyb0h-stdenv-linux.drv": [
"out"
],
"/nix/store/6pj63b323pn53gpw3l5kdh1rly55aj15-bash-5.1-p16.drv": [
"out"
]
},
"system": "x86_64-linux",
"builder": "/nix/store/1b9p07z77phvv2hf6gm9f28syp39f1ag-bash-5.1-p16/bin/bash",
"args": [
"-e",
"/nix/store/9krlzvny65gdc8s7kpb6lkx8cd02c25b-default-builder.sh"
],
"env": {
"buildInputs": "",
"builder": "/nix/store/1b9p07z77phvv2hf6gm9f28syp39f1ag-bash-5.1-p16/bin/bash",
"cmakeFlags": "",
"configureFlags": "",
"depsBuildBuild": "",
"depsBuildBuildPropagated": "",
"depsBuildTarget": "",
"depsBuildTargetPropagated": "",
"depsHostHost": "",
"depsHostHostPropagated": "",
"depsTargetTarget": "",
"depsTargetTargetPropagated": "",
"doCheck": "1",
"doInstallCheck": "",
"mesonFlags": "",
"name": "hello-2.12.1",
"nativeBuildInputs": "",
"out": "/nix/store/y4mxrg8c6l09lb2szl69vwl4f6441i5k-hello-2.12.1",
"outputs": "out",
"patches": "",
"pname": "hello",
"propagatedBuildInputs": "",
"propagatedNativeBuildInputs": "",
"src": "/nix/store/pa10z4ngm0g83kx9mssrqzz30s84vq7k-hello-2.12.1.tar.gz",
"stdenv": "/nix/store/bj5n3k01mq8bysw0rcdm7jxvhc620pd3-stdenv-linux",
"strictDeps": "",
"system": "x86_64-linux",
"version": "2.12.1"
}
}
}
其他调试工具
请注意,为了进行调试,您可能还需要阅读推导的源代码,手动nix-shell
运行这些阶段和/或按照以下精神使用各种工具builtins.trace
(请参阅这次讨论例如)。