존재하다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
업데이트 할 수 있습니다.
물론 이는 상당히 노동 집약적이므로 이 프로세스를 자동화하기 위한 몇 가지 도구가 등장했습니다.