私のNixOS設定が将来同じパッケージバージョンをビルドまたは使用するかどうかを確認できますか?

私のNixOS設定が将来同じパッケージバージョンをビルドまたは使用するかどうかを確認できますか?

存在するLHCbソフトウェアのパッケージングと展開にNixを使用する、著者は次のように書いた。

この使用を容易にするには、ソフトウェアは長期的にサポートされているオペレーティングシステムよりもはるかに長い間安定している必要があります。さらに、ソフトウェアは最終結果の正確性を保証するために元のバージョンに存在するすべてのバグを再現する必要があります。パッチを慎重に導入できるように、ビルドは反復可能でなければなりません。

ただし、NixOS 構成ファイルには (Rust マニフェストとは異なり) パッケージのバージョンは含まれていません。例えば

environment.systemPackages = with pkgs; [
    git
    git-lfs
    fish
    neovim
    nixpkgs-fmt
    nixos-option

    # Basic utils
    killall
  ];

私が正しく理解した場合、パッケージはチャンネル内で更新され、チャンネルが変更されるとパッケージも変更される可能性があります。

それでは、10年後に同じNix環境を取得または構築し、同じバージョンのパッケージをインストールできるようにするにはどうすればよいですか?

答え1

解決策は、チャネルを使用するのではなく、次のソースコードでNixpkgsのバージョンを変更することです。空のNIX_PATHを使用してNixpkgを取得する方法ウィキの記事:

{ 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 = {};
  };
}

その後、コミットハッシュを最新バージョンに変更し、フィールドを空の文字列に設定し、システムを再構築しようとした後、Nixによって返された新しいハッシュでフィールドを更新することで更新sha256できます。

もちろん、これはかなり労働集約的であるため、このプロセスを自動化するためのいくつかのツールが登場しました。

  • 万年説古いものの、まだ一般的なNixで動作する素晴らしいソリューションです。

  • ニックスフレークNixに直接組み込まれた新しいソリューションです。入力(依存関係)管理に加えて、より純粋な評価や評価キャッシュなどの他の素晴らしい機能を提供します。

    まだ実験段階ですが、私を含む多くの人がすでにこの機能を使用しています。しばらく前のバージョンと互換性のない変更はありませんでしたが、長期的な再現性が目標であれば、まだSliceをお勧めしません。またはそのような潜在的な変化を処理したくない場合。

関連情報