找到了很多描述callPackage其内部结构的来源,但没有一个提到它的位置。这就像 Nix 保守得最好的秘密,手册甚至似乎都在积极回避这个话题。我可以找到它给定的时间,但它是一个巨大的回购。
资源:
答案实际上指向callPackageWith函数 in customisation.nix,但callPackage它本身是在别处定义的。
Rob*_*ing 10
nix repl 可以告诉您定义 lambda 的位置。
$ nix repl
Welcome to Nix version 2.2.2. Type :? for help.
nix-repl> pkgs = import <nixpkgs> {}
nix-repl> pkgs.callPackage
«lambda @ /nix/store/9hffpjaa2a7djl19ncky7zcvlhyj76dn-nixos-19.03.172396.d740b2ee855/nixos/lib/customisation.nix:108:31»
Run Code Online (Sandbox Code Playgroud)
其中,包括在内的部分nixos是 my <nixpkgs>,从而为您提供答案:lib/customisation.nix第 108 行。
尽管其他答案有 lambda 输出,但我相信 的原始值callPackage实际上是在pkgs/top-level/splice.nix,链接内部定义的
lambda 中的路径不返回该 ^ 位置的原因是因为 nixpkgs 做了一些绝对疯狂的递归计算。我的理解是 被一遍又一遍地替换(引导),并且(如 )pkgs上的属性被替换多次。如果您熟悉数学中的定点组合器(例如 Y 组合器),那么这实际上就是 Nixpkgs 所应用的,直到 pkgs 稳定为止。所以实际上是一些随机/动态函数参数,而不是直接设置的属性。这个动态函数参数就是 lambda 路径所指的。pkgscallPackagespkgs.callPackage
这就像尼克斯最保守的秘密
我已经阅读源代码 3 年了,我花了至少 5 个小时来切碎nixpkgs 的最小化版本(它本身就是一个项目),以便弄清楚它callPackage实际上来自pkgs/top-level/splice.nix. 找到它的定义位置还不足以真正理解它的来源。所以,是的,我想说这是一个保守得很好的秘密,在这个答案之后可能仍然是一个秘密,因为我自己仍然很难声称理解它。
| 归档时间: |
|
| 查看次数: |
1772 次 |
| 最近记录: |