「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はさまざまなバージョン/構成を処理できますが、一方で、すべて(またはほとんど)が1つのバージョン/構成のみを使用する方が便利です。簡素化されたメンテナンス、テスト、共有バイナリなど、さまざまな方法でタスクをより効果的に共有できます。これがほとんどのディストリビューションが行うことです。 (Gentooだけが私が知っている大きなGentooとは異なり、それに費用を支払います。)

より多くのバリアントを作成するときは、gcc48andgcc49ffmpegandなどの名前(プロパティパス)を指定します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参照)
  • フレーク(デフォルトは固定)
  • 第三者、「非公式」および/または排他的な方法(例:nivniv+家政婦群れ)

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 { buildInputsですpkgs.stdenv.mkDerivation { name = "shell"; buildInputs

  • Ubuntu 22.04でこれら2つのコマンド()をaarch64さらに実行すると、2番目のコマンドはUbuntu 22.04では実行されませんaarch64-darwin

2.2 Nix式のNixpkgの修正

使用jeff heykinでコメントテンプレートとして:

ステップ0。希望のバージョンを探す

以下を使用して(ほぼ)パッケージのすべてのバージョンを見つけます。lazamarは本当に素晴らしいオンラインツールです。

ステップ1:ハッシュを使用してバージョンをインストールする

目的のバージョン行でハッシュをクリックします(例:git2.23.0そしてhtop2.2.0)次に、リストされているnix-env/コマンドを1つずつ使用するか、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
  ];
}

PS。この構成では、バージョンが非常に古く、いくつかのエラーが発生したため、最新バージョンを使用しました。

関連情報