在学习如何使用Nix包管理器时遇到的第一类Nix表达式是default.nix
;在精彩的NixOS IRC频道上,我也了解到了shell.nix
和release.nix
的存在。
我得到的印象是 - 大致 - default.nix
与nix-build
一起用于简单构建包,shell.nix
与nix-shell
一起用于创建交互式环境使用包时,release.nix
与nixops
一起用于部署包。
由于这可能不完整且部分不正确,而且由于这似乎没有明确记录,我想对这些“标准文件”进行清晰准确的解释;特别是这些文件类型(以及我缺少的任何其他标准文件),我想知道:
作为一个额外的奖励问题,我想知道在将软件包安装到NixOS模块时应该使用哪些标准文件?怎么做?
答案 0 :(得分:27)
首先,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
都应该是&#34;内置&#34; (但如果default.nix
是派生的属性集,那么它将是可构建的,而nix-build
将构建所有这些属性。)
接下来,如果找不到nix-shell
,default.nix
将使用shell.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
参数。
答案 1 :(得分:24)
正如@danbst所说,只有default.nix
和shell.nix
对nix工具有特殊含义,因此没有真正的标准,每个人都可以自由使用最符合他们需要的东西。
那就是说,这并不意味着你不能设置自己的一套规则,个人对于一个推导项目,我喜欢用以下方式安排nix文件:
default.nix
:使用callpackage
导入derivation.nix
。derivation.nix
:nixpkgs样式派生文件。shell.nix
:nix-shell file。module.nix
:NixOS模块文件,导入default.nix
。test.nix
:NixOS测试文件。release.nix
:Hydra jobset declaration。我们在东京NixOS聚会上讨论了这个话题,可以找到这样一个代码组织的例子here。