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



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

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

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

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

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

首先,default.nixshell.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.nixnix-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.nixshell.nix对nix工具有特殊意义,因此没有真正的标准,每个人都可以自由使用最适合他们需求的东西。

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

  • default.nix: 使用callpackage导入derivation.nix
  • derivation.nix:nixpkgs 样式派生文件。
  • shell.nix:尼克斯外壳文件。
  • module.nix: NixOS 模块文件,导入default.nix
  • test.nix: NixOS 测试文件。
  • release.nix:九头蛇作业集声明。

我们在东京 NixOS 聚会上讨论了这个话题,可以在这里找到这样一个代码组织的例子。

相关内容

  • 没有找到相关文章

最新更新