实用 Nix 薄片解剖学:薄片.nix 的导览之旅

这是一篇关于 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:最常见的输出,包含派生的包。
        • appsnix run的主要目标,需遵循特定模式。
        • legacyPackages:与packages类似,用于性能原因。
        • checks:主要在nix flake check时执行,可用于集成测试。
        • devShellsnix develop时激活的开发环境。
        • formatternix 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会发出警告。
    • nixConfig:可选的顶级 Flake 属性,用于指定nix.conf值。
  • 常见代码模式

    • self作为输出的参数:self是 Flake 本身的引用,用于组件之间的引用,不需要时可以隐藏在...中。
    • 添加<flakeref>作为输入:输入可以隐式添加到输出的参数中,只要可以从 Flake 注册表中解析。
    • inputs@{...}语法:当输入列表增长时,可以使用@模式指定输入,通常使用inputs名称,但任何名称都可以。
    • flake-utilsflake.parts等:这些库可以帮助简化 Flake 的开发,例如flake-utils.lib.eachDefaultSystem函数可以方便地处理多个系统,但需要适应其特定的领域特定语言。
    • 已弃用的输出:某些输出已被弃用,如defaultPackage等,nix flake check会发出警告。
  • 进一步阅读:提供了关于 Flake 的相关文档和资源的链接,如 Flake 格式、NixOS & Flakes Book、Flakes 条目和 Practical Nix flakes 等。

总结来说,这篇文章全面介绍了 Nix Flake 的各个方面,对于理解和使用 Nix Flake 非常有帮助。

阅读 15
0 条评论