我正在努力尽可能多地了解尼克斯薄片。nixpkgs我对通常导入输入并且导入的值作为函数调用这一事实感到困惑。结果如何import nixpkgs映射到薄片中的代码nixpkgs?
看起来这种用法nixpkgs在薄片中是常见的做法:
# flake.nix
{
inputs = {
flake-utils.url = "github:numtide/flake-utils";
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
/* ... */
};
outputs = { self, flake-utils, nixpkgs /*, ... */ }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = (import nixpkgs) {
inherit system;
};
in
{
/* ... */
}
);
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,nixpkgs这个flakeoutputs函数中的值是由flake产生的属性集nixpkgs。据我了解,薄片输出是一个推导,并且可以导入推导。但是导入的值如何变成函数呢?我希望它是一个属性集。
我看到nixpkgs flake包含一个lib输出。是否有某种机制可以lib调用具有属性路径的属性?我一直在寻找这方面的信息,但没有找到任何信息。
如果(import nixpkgs) {}有效地调用该lib属性,那么导入与直接调用有何不同nixpkgs.lib?根据我所读到的内容,导入派生对强制评估或不强制评估某些内容有一定的影响。我还不明白细节。
雪花的行为就像路径一样,因为它们.outPath属性包含由 Nix 自动添加到所有 Flake 的 Flake 源路径。
这让import将文件加载为 Nix 值。
具体来说,因为路径是一个目录,所以它加载default.nix其中的 ,然后加载impure.nix,其中包含一个函数。
请注意,评估薄片的方式(不带--impure),评估始终是纯粹的,尽管上面有“impure.nix”文件名。
该.outPath属性之所以得名,是因为它还负责将派生强制转换为字符串。