64

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

我的印象是 - 粗略地 -default.nix用于nix-build简单地构建包,shell.nix用于nix-shell创建与包的交互环境,并release.nix用于nixops部署包。

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

  1. 这种文件的典型用例是什么?它们应该用于什么?
  2. 这种文件类型的结构通常如何?它的最低要求是什么?
  3. 您能否在其使用上下文中展示此类文件的范例示例,即使用说明并包括在 shell 或其他 Nix 表达式中使用它所需的代码行?

作为一个额外的奖励问题,我想知道在将软件包安装到 NixOS 模块时应该使用这些标准文件中的哪些(如果有的话)?那怎么做?

4

2 回答 2

55

首先,在 Nix 工具default.nixshell.nix具有特殊的含义,但是release.nix是一种方便的工具。

接下来,default.nix在运行时用作默认文件,在运行nix-buildshell.nix用作默认文件nix-shell。就像你说的那样。

接下来,default.nix不仅用于nix-build. 例如,<nixpkgs/lib/default.nix>用作函数的聚合器,并且不包含派生。因此,并非每个default.nix都应该是“构建”的(但如果default.nix是派生的属性集,它将是可构建nix-build的,并将构建所有这些)。

接下来,如果没有找到,nix-shell 使用。default.nixshell.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论点。

于 2017-05-22T17:31:08.277 回答
47

正如@danbst 所说,default.nix并且shell.nix对于 nix 工具具有特殊含义,因此没有真正的标准,每个人都可以自由使用最适合他们需求的东西。

也就是说,这并不意味着您不能设置自己的规则集,个人对于单个派生项目,我喜欢按以下方式排列 nix 文件:

  • default.nix:callpackage用于导入derivation.nix
  • derivation.nix: nixpkgs 风格派生文件。
  • shell.nix: nix-shell 文件。
  • module.nix: NixOS 模块文件,导入default.nix.
  • test.nix: NixOS 测试文件。
  • release.nix: Hydra 作业集声明。

我们在东京 NixOS 聚会上讨论了这个主题,可以在此处找到此类代码组织的示例。

于 2017-06-19T02:48:29.860 回答