Flake 的基本结构#
一个典型的 flake.nix 是属性集,其中 outputs 是接收输入并返回输出属性集的函数。
{
description = "我的 NixOS 配置";
inputs = {
# 这里定义依赖
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
home-manager.url = "github:nix-community/home-manager";
};
outputs = { self, nixpkgs, ... }@inputs: {
# 这里定义产出(系统配置、软件包、Shell 环境等)
nixosConfigurations.my-host = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [ ./configuration.nix ];
};
};
}1. Inputs (输入)#
inputs 是你要引用的外部资源。
nixpkgs:整个软件仓库。
home-manager:用户层配置工具。
flake-utils:一个常用的辅助库。
follows关键字:非常重要!它让指定的子输入跟随顶层 nixpkgs,减少依赖图中的重复 nixpkgs 来源;仍可能存在多个包版本,且共享输入不保证所有外部项目兼容。home-manager.inputs.nixpkgs.follows = "nixpkgs";
2. Outputs (输出)#
outputs 是你这个 Flake 制造出来的东西.
nixosConfigurations:供nixos-rebuild使用,核心是你的系统。homeConfigurations:供home-manager使用。devShells:供nix develop使用的开发环境。packages:你自己打包的软件。
这里的 self 和 @inputs 是什么?#
self:代表当前的 Flake 自身。你可以通过它引用自己定义的子文件。@inputs:语法糖,表示把所有的输入参数一起捕获。
实战技巧:看懂 outputs 的层级#
如果你运行 nix flake show,你会看到树状的输出。在代码里,这些层级必须严丝合缝地对上,nixos-rebuild 才能找到你的配置。
参考与延伸
根据技术笔记重新整理,示例使用通用名称。