OFFSET偏移
← 文章目录OFFSET / FIELD NOTESNO. 027

Flake Utils 与项目模板

为多个平台生成输出,并把开发环境整理成可复用模板。

所在专题Flakes:项目与依赖管理 ↗
约 3 分钟阅读开始阅读

什么是 flake-utils?#

由于 Flake 的 outputs 通常需要为不同的架构(如 x86_64-linux, aarch64-linux)重复定义相同的属性集,代码会变得非常冗长。 flake-utils 提供了一个简单的辅助函数来消除这种重复。

1. 传统写法

你需要手动循环所有架构。

{
  outputs = { self, nixpkgs }: {
    packages.x86_64-linux.default = ...;
    packages.aarch64-linux.default = ...;
  };
}

2. 使用 flake-utils 的简洁写法

{
  inputs.flake-utils.url = "github:numtide/flake-utils";

  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";

  outputs = { self, nixpkgs, flake-utils }:
    flake-utils.lib.eachDefaultSystem (system:
      let pkgs = nixpkgs.legacyPackages.${system}; in
      {
        packages.default = pkgs.hello;
        devShells.default = pkgs.mkShell { buildInputs = [ pkgs.git ]; };
      }
    );
}
  • eachDefaultSystem:为库定义的默认系统列表生成输出;可用 eachSystem 指定自己的平台集合。

Flake 模板化 (Templates)#

Flake 允许你创建“模板”,别人可以通过一个命令快速初始化项目。

1. 查看官方模板

nix flake show templates

2. 使用模板初始化

# 初始化一个简单的 python 环境
nix flake init -t templates#simple

3. 在自己的 Flake 里定义模板

你可以把自己的配置做成模板分享给别人:

{
  outputs = { self }: {
    templates.my-rust-app = {
      path = ./templates/rust;
      description = "一个基础的 Rust 项目模板";
    };
  };
}

为什么你要在意这个?#

在 NixOS,通过定义自己的 Flake 模板,你可以极速搭建不同语言的开发环境,再也不用手动配置 PATH。

参考与延伸

  1. Nix Flake 手册 ↗
  2. Nix flake update ↗
  3. Nix flake check ↗
  4. flake-utils 上游 ↗

根据技术笔记重新整理,示例使用通用名称。

沿专题继续阅读

Flakes:项目与依赖管理

  1. 01Flake 结构:inputs 与 outputs
  2. 02flake.lock 与可复现性
  3. 03Flake Utils 与项目模板
  4. 04外部 Flake 引用与协作
  5. 05将 NixOS 配置迁移到 Flakes
  6. 06Flakes 项目与依赖管理教程
  7. 07Flake 更新机制
  8. 08flake.lock 回退与手动编辑
CONTINUE READING / 下一篇外部 Flake 引用与协作

连接外部模块和软件包,并检查依赖版本之间的关系。