什么是 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 templates2. 使用模板初始化
# 初始化一个简单的 python 环境
nix flake init -t templates#simple3. 在自己的 Flake 里定义模板
你可以把自己的配置做成模板分享给别人:
{
outputs = { self }: {
templates.my-rust-app = {
path = ./templates/rust;
description = "一个基础的 Rust 项目模板";
};
};
}为什么你要在意这个?#
在 NixOS,通过定义自己的 Flake 模板,你可以极速搭建不同语言的开发环境,再也不用手动配置 PATH。
参考与延伸
根据技术笔记重新整理,示例使用通用名称。