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

flake.lock 与可复现性

用版本锁定记录依赖来源,同时理解复现结果的条件。

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

什么是 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 仓库。它是你系统配置不可分割的一部分。

参考与延伸

  1. Nix Flake 手册 ↗
  2. Nix flake update ↗
  3. Nix flake check ↗

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

沿专题继续阅读

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 Utils 与项目模板

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