什么是 flake.lock?#
当你第一次运行 nix build 或 nixos-rebuild switch 时,Nix 会根据 flake.nix 中的 URL(比如 github:nixos/nixpkgs/nixos-unstable)去 GitHub 上获取该仓库最新的 Commit ID。
这些具体的 Commit ID 和相应的哈希值会被记入一个 JSON 文件:flake.lock。
为什么它如此重要?#
1. 极致的复现性
在传统的 nix-channel 模式下,两台机器运行 nix-channel --update,因为时间点不同,可能下载到不同版本的包。
在 Flakes 模式下:只要 flake.lock 不变,同一平台和配置下,依赖来源可保持一致。最终产物仍受平台、构建确定性、外部资源可得性及非纯求值影响。
2. 协作神器
如果你把自己的 NixOS 配置推送到 GitHub,别人克隆下来后,直接运行构建可共享相同依赖版本;硬件配置、平台和机器状态仍需分别适配。
管理 lock 文件#
1. 更新依赖
- 全部更新:
nix flake update这会刷新所有依赖到各自仓库的最新 Commit。 - 定向更新:
nix flake update nixpkgs只更新nixpkgs。
2. 检查锁定状态
打开 flake.lock 文件(它是人类可读的 JSON):
"nixpkgs": {
"locked": {
"lastModified": 1712048532,
"narHash": "sha256-...",
"rev": "5ac7...",
"type": "github"
}
}rev:具体的 Git Commit ID。这就是锁定的核心。
实战建议:提交到 Git#
必须把 flake.lock 文件提交到你的 Git 仓库。它是你系统配置不可分割的一部分。
参考与延伸
根据技术笔记重新整理,示例使用通用名称。