如何判断哪些 nixpkg 正在用于构建派生?

如何判断哪些 nixpkg 正在用于构建派生?

我试图找出原因我无法nix-build产生预期的输出。有没有办法检查哪些 nixpkgs 版本用于构建派生?nix-build --verbose就像在某个时刻打印 nixpkgs 哈希值一样。

对于用例,请考虑{pkgs ? import ./nixpkgs.nix}.你怎么知道无论某物pkgs是否为该推导提供参数?如果派生最终是使用当前操作系统 nixpkgs 构建的,那么某些东西一定提供了参数pkgs。如果它是用定义的 nixpkgs 构建的,nixpkgs.nix那么它就是不是假如。手动找出属于哪一种情况将非常繁琐:

  1. 查看来自 nixpkgs 的派生的所有依赖项
  2. 对于每个依赖项,检查它在操作系统和nixpkgs.nixnixpkgs 版本中是否具有不同的哈希值
  3. 如果哈希值不同,请检查它来自哪个 nixpkgs 并得出结论,使用了 nixpkgs
  4. 如果哈希值相同,则继续

当然,如果所有依赖项哈希值在两个 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(请参阅这次讨论例如)。

相关内容