如何确保 NixOS 配置将来构建或使用相同的软件包版本?

如何确保 NixOS 配置将来构建或使用相同的软件包版本?

使用 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 返回的新哈希来进行更新。

当然,这是相当劳动密集型的,因此出现了几种自动化此过程的工具:

  • 尼夫是较旧但仍然很棒的解决方案,适用于常规 Nix。

  • 尼克斯薄片是直接内置于 Nix 中的新解决方案。除了输入(依赖项)管理之外,它们还带来了其他不错的功能,例如更纯粹的评估或评估缓存。

    它们仍处于实验阶段,但包括我在内的许多人已经依赖该功能。虽然一段时间以来没有出现任何向后不兼容的变化,但如果长期可重复性是目标,我仍然不会推荐薄片。或者如果您不愿意应对此类潜在的变化。

相关内容