내 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를 권장하지 않습니다. 또는 그러한 잠재적인 변화를 처리하고 싶지 않은 경우.

관련 정보