![如何确保 NixOS 配置将来构建或使用相同的软件包版本?](https://linux22.com/image/224971/%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%20NixOS%20%E9%85%8D%E7%BD%AE%E5%B0%86%E6%9D%A5%E6%9E%84%E5%BB%BA%E6%88%96%E4%BD%BF%E7%94%A8%E7%9B%B8%E5%90%8C%E7%9A%84%E8%BD%AF%E4%BB%B6%E5%8C%85%E7%89%88%E6%9C%AC%EF%BC%9F.png)
在使用 Nix 进行 LHCb 的软件打包和分发,作者写道:
为了方便这种使用,软件必须长期稳定;甚至比长期支持操作系统的可用时间还要长。此外,该软件应重现原始版本中存在的所有错误,以确保最终结果的准确性。构建应该是可重复的,以允许仔细引入补丁。
但 NixOS 配置文件不包含包的版本(与 Rust 清单不同),例如
environment.systemPackages = with pkgs; [
git
git-lfs
fish
neovim
nixpkgs-fmt
nixos-option
# Basic utils
killall
];
如果我理解正确,包可以在频道内更新,并且当频道更改时它们可以更改。
那么,如何确保在 10 年后我能够获得或构建相同的 Nix 环境并安装相同版本的软件包?
答案1
解决方案不是使用通道,而是将 Nixpkgs 版本固定在源代码中,如如何使用空 NIX_PATH 获取 Nixpkgs维基文章:
{ pkgs, ... }:
let
nixpkgs = builtins.fetchTarball {
url = "https://github.com/NixOS/nixpkgs/archive/3389f23412877913b9d22a58dfb241684653d7e9.tar.gz";
sha256 = "0wgm7sk9fca38a50hrsqwz6q79z35gqgb9nw80xz7pfdr4jy9pf8";
};
in
{
environment.systemPackages = with pkgs; [
...
];
# Override the `pkgs` argument of modules.
nixpkgs.pkgs = pkgs = import nixpkgs {
# Avoid impurities from `NIXPKGS_CONFIG` environment variable and `~/.config/nixpkgs/config.nix`.
config = {};
};
}
然后,您可以通过将提交哈希更改为较新版本、将sha256
字段设置为空字符串、尝试重建系统,然后将字段更新为 Nix 返回的新哈希来进行更新。
当然,这是相当劳动密集型的,因此出现了几种自动化此过程的工具: