在学习如何使用Nix包管理器时,人们首先遇到的Nix表达式之一是default.nix
;在精彩的NixOS IRC频道上,我也了解到shell.nix
和release.nix
的存在。
我的印象是 - 大致 -default.nix
与nix-build
一起使用以简单地构建包,shell.nix
与nix-shell
一起使用以创建与包的交互式环境,release.nix
与nixops
一起使用部署包。
由于这可能不完整且部分不正确,并且由于这似乎没有明确的文档记录,因此我想对这些类型的"标准文件"进行清晰准确的解释;特别是,对于这些文件类型中的每一种(以及我缺少的任何其他标准文件),我想知道:
- 此类文件的典型用例是什么?它们不应该用于什么?
- 这种文件类型通常是如何构建的?它的最低要求是什么?
- 您能否在其使用上下文中展示此类文件的范例示例,即使用说明并包括在 shell 或其他 Nix 表达式中使用它所需的代码行?
作为一个额外的奖励问题,我想知道在将软件包安装到 NixOS 模块中时应该使用这些标准文件中的哪个(如果有的话)?怎么做呢?
首先,default.nix
和shell.nix
在Nix工具中具有特殊的含义,但release.nix
是一种方便。
接下来,default.nix
在运行nix-build
时用作默认文件,shell.nix
在运行nix-shell
时用作默认文件。就像你说的。
接下来,default.nix
不仅用于nix-build
。例如,<nixpkgs/lib/default.nix>
用作函数的聚合器,不包含派生。因此,并非每个default.nix
都应该被"构建"(但如果default.nix
是派生的属性集,它将是可构建的,nix-build
将构建所有这些派生)。
接下来,如果未找到shell.nix
,nix-shell
将使用default.nix
。
接下来,导入目录时default.nix
用作默认文件。因此,如果您编写x = import ./some/directory;
,则将导入./some/directory/default.nix
。这实际上应该解释为什么"nix-build ."
使用default.nix
。
最后,default.nix
有两种常见的推导格式:推导和callPackage
推导。你不能nix-build
后者。nixpkgs 中几乎所有的软件包都是用这种风格编写的,请参见hello
。但你可以
nix-build -E 'with import <nixpkgs> { }; callPackage ./path/to/default.nix { }'
作为解决方法。nix-shell
也支持这一-E
论点。
正如@danbst所说,只有default.nix
和shell.nix
对nix工具有特殊意义,因此没有真正的标准,每个人都可以自由使用最适合他们需求的东西。
也就是说,这并不意味着你不能设置自己的一套规则,就个人而言,对于单个派生项目,我喜欢按以下方式排列 nix 文件:
default.nix
: 使用callpackage
导入derivation.nix
。derivation.nix
:nixpkgs 样式派生文件。shell.nix
:尼克斯外壳文件。module.nix
: NixOS 模块文件,导入default.nix
。test.nix
: NixOS 测试文件。release.nix
:九头蛇作业集声明。
我们在东京 NixOS 聚会上讨论了这个话题,可以在这里找到这样一个代码组织的例子。