这是一篇关于 Nix Flake 的详细指南,涵盖了flake.nix
文件的各个方面,包括定义、属性、常见代码模式和进一步阅读等内容:
- 关于此文章:普遍认为 Nix 文档碎片化且难理解,此文章旨在提供
flake.nix
文件的单页描述,帮助新用户理解,代码示例尽量自足且有时会故意冗长,文章写作时 Nix 版本为 2.21.0。 - Flake 定义:将 Flake 视为接受输入并产生输出的函数,输入可以是其他 Flake 或文件路径,输出可以是 Linux 包、NixOS 配置等。
Flake 属性:
- 描述:通常是关于 Flake 用途的简短描述,必须是字符串,不能使用 Nix 语言计算,不是必需的,但
outputs
属性是必需的。 - 输入:Flake 可以接受其他 Flake 或文件路径作为输入,默认输入是 Flake 引用,也可以使用非 Flake 输入,消费者可以覆盖 Flake 的传递输入,还可以将其他 Flake 作为输入并在输出中使用。
输出:分为系统特定输出和系统独立输出,系统特定输出依赖于平台,系统独立输出可能与系统无关或处理系统依赖,输出是一个属性集,每个输出都是可选的。
系统特定输出:
- packages:最常见的输出,包含派生的包。
- apps:
nix run
的主要目标,需遵循特定模式。 - legacyPackages:与
packages
类似,用于性能原因。 - checks:主要在
nix flake check
时执行,可用于集成测试。 - devShells:
nix develop
时激活的开发环境。 - formatter:
nix fmt
执行时运行的单个派生。 - hydraJobs:用于 Hydra 进行持续集成的输出。
- bundlers:用于后处理派生的函数。
系统独立输出:
- overlays:用于推送或覆盖
pkgs
的属性。 - nixosConfigurations:用于
nixos-rebuild
管理 NixOS 机器。 - templates:用于
nix flake init
初始化 Flake。 - nixosModules:提供 NixOS 模块。
- home-manager modules:常见于项目 Flake 中的 Home Manager 模块。
- lib 和其他非标准输出:常见的基于 Nix 语法的函数输出,
nix flake check
会发出警告。
- overlays:用于推送或覆盖
- nixConfig:可选的顶级 Flake 属性,用于指定
nix.conf
值。
- 描述:通常是关于 Flake 用途的简短描述,必须是字符串,不能使用 Nix 语言计算,不是必需的,但
常见代码模式:
self
作为输出的参数:self
是 Flake 本身的引用,用于组件之间的引用,不需要时可以隐藏在...
中。- 添加
<flakeref>
作为输入:输入可以隐式添加到输出的参数中,只要可以从 Flake 注册表中解析。 inputs@{...}
语法:当输入列表增长时,可以使用@
模式指定输入,通常使用inputs
名称,但任何名称都可以。flake-utils
、flake.parts
等:这些库可以帮助简化 Flake 的开发,例如flake-utils.lib.eachDefaultSystem
函数可以方便地处理多个系统,但需要适应其特定的领域特定语言。- 已弃用的输出:某些输出已被弃用,如
defaultPackage
等,nix flake check
会发出警告。
- 进一步阅读:提供了关于 Flake 的相关文档和资源的链接,如 Flake 格式、NixOS & Flakes Book、Flakes 条目和 Practical Nix flakes 等。
总结来说,这篇文章全面介绍了 Nix Flake 的各个方面,对于理解和使用 Nix Flake 非常有帮助。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。