"nix-shell"을 사용하여 패키지 버전을 수정하는 방법은 무엇입니까?

"nix-shell"을 사용하여 패키지 버전을 수정하는 방법은 무엇입니까?

내가 아는 한, 이 플래그를 사용하여 Nix 패키지의 특정 버전을 사용할 수 있습니다 -I. 하지만 shell.nixconf에서 이와 같은 것을 가질 수 있는지 궁금합니다 .

  • gitv2.1.2
  • htopv1.2.3
  • ...

특정 도구 버전을 보장하는 기능.

답변1

예, 이를 수행하는 방법은 여러 가지가 있지만 이만큼 간단하고 간단한 방법은 없으며 git v2.1.2; htop v1.2.3많은 주의 사항이 있습니다.

옆에
프로그래밍 언어 패키지의 버전을 지정하는 것도 가능하지만 이 주제는 더 혼란스러워 보입니다. 현재까지 가장 유망한 표준화 노력은 다음과 같습니다.dream2nix.

0. 방법

즉, 글을 쓰는 시점에서 사용 가능합니다.

0.1 "버전 관리된" 속성 경로(사용 가능한 경우)

단일 버전 정책

합당한 이유가 있는 경우에만 nixpkgs에 여러 버전을 보관합니다. Nix는 다양한 버전/구성을 처리할 수 있지만, 반면에 모두(또는 대부분)가 하나의 버전/구성만 사용하는 것이 더 편리합니다. 단순화된 유지 관리, 테스트, 공유 바이너리 등 다양한 방법으로 작업을 더 효과적으로 공유할 수 있습니다. 이것이 대부분의 배포판이 하는 일입니다. (젠투만이 내가 아는 큰 젠투와 다르며 그에 대한 비용을 지불합니다.)

더 많은 변형을 생성할 때 gcc48and gcc49또는 ffmpegand 와 같이 이름(속성 경로)을 지정하면 됩니다 ffmpeg-full.

--vcunat이 2015년 9월 6일에 댓글을 작성했습니다.존재하다Nixpkgs 문제 #9682

인용하다jtojnar의 말 대답보다 구체적인 예:

$ nix-env -qP --available nodejs
nixos.nodejs       nodejs-10.18.1
nixos.nodejs-10_x  nodejs-10.18.1
nixos.nodejs-12_x  nodejs-12.14.1
nixos.nodejs-13_x  nodejs-13.6.0
$ nix-env -iA nixos.nodejs-13_x

0.2결정된

명시적으로 또는 암시적으로

  • Nix 파생 표현(예제 2.2 참조)
  • Nix 명령줄 도구(예제 2.1 참조)
  • 피복층
  • 재정의(예제 2.3 참조)
  • 플레이크(기본값은 고정되어 있음)
  • 제3자, "비공식" 및/또는 독점 방법(예:niv,niv+ 가정부,무리)

1. 약관

1.1 고정

내가 찾을 수 있는 가장 좋은 설명은 다음과 같습니다.이 댓글CMCD Long Kai는 다음과 같이 설명합니다.

결정된안에닉스 익스프레스을 사용하는 것을 의미닉스 슈트(대개닉스 포장또는 그 분기점)이 기록의 특정 지점(예: 일부 상태)에서 발생합니다.

Git 사용(콘텐츠 주소 지정) 해시값 제출닉스 포장레포는 비슷하다"분리된 헤드 상태": Nix 표현식 관점에서 각 패키지 정의는 릴리스 커밋 시점의 최신 버전입니다.

예를 들어, 고정된 Nixpkgs 패키지 세트를 참조할 때39cd40f(2017년 9월 29일) "최신" 버전은 다음과 같습니다.

경고하다
Nixpkgs 저장소는 공식 Nix 패키지 세트를 추적합니다.그리고Nix 표현식에 사용할 수 있는 편리한 도구! 이것이 어떻게 가정을 깨뜨리는지 보려면 아래의 예제 2.1을 참조하십시오.

내가 아는 한, "고정"이라는 용어는 아직 공식 문서에 정의되어 있지 않습니다. (이것Nixpkgs 매뉴얼예를 들어 한 번 언급했지만 설명은 없습니다. )

1.2 Nix 표현식

다음을 사용하여 작성된 코드 조각nix 표현 언어.

1.3 표현식의 Nix 파생

닉스 익스프레스이는 다음과 같이 평가됩니다.닉스 파생(보통 최종 호출을 통해 derivation(원천)프리모프, 가장 일반적으로 다음을 통해 mkShell(원천) 또는 mkDerivation(원천)).

노트:Nix 파생 및 Nix 파생 표현식

Nix와 Nix를 명확하게 구분하면 Nix에 대해 추론하는 것이 더 쉽습니다.닉스 파생그리고 계산 결과는닉스 파생(즉, Nix가 추론한 표현식) 더 명확하게 만들어 보셨나요?이 답변, 하지만 업데이트가 필요하므로 소금 한 알씩 섭취하십시오.

1.4 프리모푸

원시 작업 또는프리모프는 언어에 내장된 함수입니다. 기본적으로 범위 내에 있으므로 정의하거나 가져올 필요가 없습니다. 하지만 일반적인 식별자이기 때문에할 수 있는로컬 정의에 의해 재정의됩니다.

--Eelco Dolstra, 순수 기능적 소프트웨어 배포 모델(박사 학위 논문)(2006년 1월 18일)

이들은 다음에서 구현됩니다.NixOS/nix환매.

1.5 Nix 파생

(자리 표시자)

1.6 패키지 설정

바라보다정장이란 무엇입니까?NixOS에 대한 토론 및 설명라이언텀의 답변:

패키지 패키지컬렉션입니다닉스 익스프레스s는 다음과 같이 평가됩니다.속성 세트("attrset"라고도 함) 여기서 name은 패키지 이름(또는 재귀적으로)입니다.정장) 값은닉스 파생.

예:

2. 예시

nix-shell2.1 호출 시 Nixpkg 수정

일반적으로 사용되는 Nix-shell 표현식을 압축합니다.

{ pkgs ? import <nixpkgs> {} }:

pkgs.mkShell {

  buildInputs = [
    pkgs.git
    pkgs.htop
  ];

  shellHook = ''
    echo "git:  $(git  --version)"
    echo "htop: $(htop --version)"
  '';
}

한 줄로 만든 다음

nix-shell \
-I nixpkgs=https://github.com/NixOS/nixpkgs/archive/39cd40f7bea40116ecb756d46a687bfd0d2e550e.tar.gz \
-E '{ pkgs ? import <nixpkgs> {} }: pkgs.mkShell { buildInputs = [ pkgs.git pkgs.htop ]; shellHook = "echo \"git: $(git --version)\"; echo \"htop: $(htop --version)\";"; }'

mkShell아직 구현되지 않았기 때문에 작동하지 않습니다 .

nix-shell \
-I nixpkgs=https://github.com/NixOS/nixpkgs/archive/39cd40f7bea40116ecb756d46a687bfd0d2e550e.tar.gz \
-E '{ pkgs ? import <nixpkgs> {} }: pkgs.stdenv.mkDerivation { name = "shell"; buildInputs = [ pkgs.git pkgs.htop ]; shellHook = "echo \"git: $(git --version)\"; echo \"htop: $(htop --version)\";"; }'

노트:

  • 두 스니펫의 유일한 차이점은 이 부분 pkgs.mkShell { buildInputspkgs.stdenv.mkDerivation { name = "shell"; buildInputs.

  • Ubuntu 22.04에서 이 두 명령( )을 aarch64추가로 실행하면 두 번째 명령은 Ubuntu 22.04에서 실행되지 않습니다 aarch64-darwin.

2.2 Nix 표현식의 Nixpkg 수정

사용Jeff Heykin의 댓글템플릿으로:

0단계. 원하는 버전 찾기

다음을 사용하여 (거의) 패키지의 모든 버전을 찾습니다.lazamar 정말 놀라운 온라인 도구입니다..

1단계: 해시를 사용하여 버전 설치

원하는 버전 행에서 해시를 클릭합니다(예:git2.23.0그리고htop2.2.0) 그런 다음 나열된 nix-env/명령을 하나씩 사용하거나 Nix 표현식 조각을 파일에 복사합니다(그리고 충돌을 피하기 위해 변수로 이름을 바꿉니다).nix-shell


# git_htop.nixshell

let

  pkgs_for_git = import (builtins.fetchTarball {
    url = "https://github.com/NixOS/nixpkgs/archive/bca9437d1eae9519b61a58f2593f25f65494f8e9.tar.gz";
  }) {};

  pkgs_for_htop = import (builtins.fetchTarball {
    url = "https://github.com/NixOS/nixpkgs/archive/b5e903cedb331f9ee268ceebffb58069f1dae9fb.tar.gz";
  }) {};

  # Copied lines above from lazamar's tool,
  # but the shortened form works too:
  #
  #   pkgs = import (builtins.fetchTarball "<url>") {};

in
  
  # Chose `pkgs_for_htop` arbitrarily; what matters
  # is that the  derivation function  exists in the
  # pinned Nixpkgs.

  pkgs_for_htop.mkShell {

    buildInputs = [
      pkgs_for_htop.htop
      pkgs_for_git.git
    ];

    shellHook = ''
      echo "git:  $(git  --version)"
      echo "htop: $(htop --version)"
    '';
  }

그런 다음 호출하십시오.

nix-shell -v git_htop.nixshell

2.3 오버레이(스텁)로 패키지 지정하기

간단한 링크nix-configJwiegley 저장소의 파일;아직 이해가 안 가는데 포함하고 싶어요.

3. 추가 자료

여전히 진화 중인 이 주제를 둘러싼 온라인 토론:


(더 많은 예제를 통해 이에 대해 확장하고 싶습니다.)

답변2

특정 패키지 버전의 해시가 포함된 nixpkgs 아카이브를 가져올 수 있습니다. 예를 들어 해시 값을 찾을 수 있습니다.여기

{ pkgs ? import <nixpkgs> { } }:

let
  gitPkgsHash = "0c159930e7534aa803d5cf03b27d5c86ad6050b7"; #git 2.16.2
  htopPkgsHash = "5ed9176c52e4ceed2755a19b3e8357a0772de8ff"; #htop 2.0.0
  gitPkgs = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/${gitPkgsHash}.tar.gz") { };
  htopPkgs = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/${htopPkgsHash}.tar.gz") { };
in

pkgs.mkShell {
  buildInputs = [
    gitPkgs.gitAndTools.gitFull
    htopPkgs.htop
  ];
}

추신. 이 구성에서는 버전이 매우 오래되어 일부 오류가 발생했기 때문에 최신 버전을 사용했습니다.

관련 정보