首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何判断哪些nixpkgs用于构建派生程序?

如何判断哪些nixpkgs用于构建派生程序?
EN

Unix & Linux用户
提问于 2022-09-30 12:08:41
回答 1查看 522关注 0票数 0

我想弄清楚为什么是我搞不懂nix-build产生预期的产出。有什么方法可以检查正在使用哪个nixpkgs版本构建派生程序吗?类似于nix-build --verbose,可以在某个时候打印nixpkgs哈希。

对于用例,请考虑{pkgs ? import ./nixpkgs.nix}。您如何知道某物是否为此派生提供了pkgs参数?如果派生结果是用当前的OS nixpkgs构建的,那么一定有什么东西提供了pkgs参数。如果它是用nixpkgs.nix中定义的nixpkgs构建的,那么就没有提供它。要弄清楚其中哪一种是这样的情况,手工操作将是非常繁琐的:

  1. 查看来自nixpkgs的派生的所有依赖项。
  2. 对于每个依赖项,检查它在nixpkgs的OS和nixpkgs.nix版本中是否有不同的散列。
  3. 如果散列不同,请检查它来自哪个nixpkgs,并得出使用nixpkgs的结论。
  4. 如果散列相同,则继续

当然,这可能并不重要,如果在两个nixpkgs版本中所有依赖散列都是相同的,但是至少能够在不需要大量手工操作的情况下解决这个问题是很好的。

场外欺骗

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2022-10-18 10:35:09

询问哪个nixpkgs正在使用nix-build可能并不是很好的定义,因为nixpkgs和任何其他变量一样只是一个变量(它可能从url、本地文件、通道、简单属性集中获得它的值)。实际上,您甚至可以在同一个存储库中拥有多个nixpkgs实例。您可以使用不同的方法找到nixpkgs版本:

Method 1:如果您知道来自哪个通道nixpkgs (例如),并且只想检查哪个提交是您指向的通道:

代码语言:javascript
复制
$ nix-instantiate --eval -E '(import  {}).lib.version'
"22.11pre405560.2da64a81275"

(请注意,最后一个数字是nixpkgs的提交,您可以使用nix eval代替nix-instantiate,但据我所知,接口并不稳定)

您还可以使用

代码语言:javascript
复制
$ nix-instantiate --eval -E '(import  {}).path'
/nix/store/p5jayhh78vbq7kpw6p3m1s61g365zwam-nixos/nixos

Method 2:对于更复杂的派生(甚至不确定在哪里定义nixpkgs ),可以使用buildins.trace调试它,就像调试任何其他变量一样:

为了给出一个更精确的例子,让我们假设您的文件是:

代码语言:javascript
复制
{
  pkgs ? import  {}
}:
pkgs.hello

然后,您可以使用以下方法检查pkgs的值:

代码语言:javascript
复制
{
  pkgs ? import  {}
}:
builtins.trace (pkgs.lib.version) pkgs.hello

在编译时,可以得到这样的结果,其中nixpkgs的提交是2da64a81275

代码语言:javascript
复制
$ nix-build a.nix
trace: 22.11pre405560.2da64a81275
/nix/store/y4mxrg8c6l09lb2szl69vwl4f6441i5k-hello-2.12.1

有关更多调试功能,请参见这里

PS:别忘了,nix是一种懒惰的语言,只对需要的东西进行评估。因此,如果不使用变量,则不会调用该变量的跟踪。

代码语言:javascript
复制
$ cat a.nix
{
  pkgs ? import  {}
}:
let
  x = builtins.trace (pkgs.lib.version) 2; # <-- never needed
in
pkgs.hello
$ nix-build a.nix
/nix/store/y4mxrg8c6l09lb2szl69vwl4f6441i5k-hello-2.12.1

Method 3:如果您想知道派生的所有依赖项,而不关心nixpkgs的版本(毕竟,派生是在内部调用给定的nixpkgs,然后重写其输入):

代码语言:javascript
复制
$ 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"
    }
  }
}

Other调试工具注意,为了调试,您也可能希望读取派生的源代码,进入nix-shell手动运行阶段和/或按照builtins.trace的精神使用各种工具(例如,参见这一讨论 )。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/719279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档