何时以及如何使用default.nix,shell.nix和release.nix?

时间:2017-05-20 16:18:02

标签: nix nixos nixops

在学习如何使用Nix包管理器时遇到的第一类Nix表达式是default.nix;在精彩的NixOS IRC频道上,我也了解到了shell.nixrelease.nix的存在。

我得到的印象是 - 大致 - default.nixnix-build一起用于简单构建包,shell.nixnix-shell一起用于创建交互式环境使用包时,release.nixnixops一起用于部署包。

由于这可能不完整且部分不正确,而且由于这似乎没有明确记录,我想对这些“标准文件”进行清晰准确的解释;特别是这些文件类型(以及我缺少的任何其他标准文件),我想知道:

  1. 此类文件的典型用例是什么?他们应该用于什么?
  2. 这种文件类型的结构通常如何?它的最低要求是什么?
  3. 您能否在其使用上下文中显示此类文件的范例示例,即使用说明并包含在shell中使用它或其他Nix表达式所需的代码行?
  4. 作为一个额外的奖励问题,我想知道在将软件包安装到NixOS模块时应该使用哪些标准文件?怎么做?

2 个答案:

答案 0 :(得分:27)

首先,default.nixshell.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-shelldefault.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.nixshell.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