私が知っている限り、このフラグを使用してNixパッケージの特定のバージョンを使用できます-I
。しかし、shell.nix
confでこのようなものを持つことができるかどうか疑問に思います。
git
v2.1.2htop
v1.2.3- ...
特定のツールバージョンを保証する機能。
答え1
はい、これを行う方法はいくつかありますが、これほど簡単で簡単な方法はなく、git v2.1.2; htop v1.2.3
多くの注意事項があります。
横に
プログラミング言語パッケージのバージョンを指定することも可能ですが、このトピックはより混乱しているようです。現在までの最も有望な標準化努力は次のとおりです。dream2nix
。
0. 方法
つまり、文章を書いている時点で利用可能です。
0.1「バージョン管理」属性パス(使用可能な場合)
シングルバージョンポリシー
妥当な理由がある場合にのみ、nixpkgsに複数のバージョンを保持してください。 Nixはさまざまなバージョン/構成を処理できますが、一方で、すべて(またはほとんど)が1つのバージョン/構成のみを使用する方が便利です。簡素化されたメンテナンス、テスト、共有バイナリなど、さまざまな方法でタスクをより効果的に共有できます。これがほとんどのディストリビューションが行うことです。 (Gentooだけが私が知っている大きなGentooとは異なり、それに費用を支払います。)
より多くのバリアントを作成するときは、
gcc48
andgcc49
やffmpeg
andなどの名前(プロパティパス)を指定しますffmpeg-full
。
引用する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参照)
- フレーク(デフォルトは固定)
- 第三者、「非公式」および/または排他的な方法(例:
niv
、niv
+家政婦、群れ)
1. 規約
1.1 固定
私が見つけることができる最高の説明は次のとおりです。このコメントCMCD Long Kaiは次のように説明しています。
決定した中ニックスエクスプレスを使用することを意味しますニックススーツ(通常ニックス包装またはその分岐点)は、記録の特定の点(たとえば、いくつかの状態)で発生します。
Gitを使う(コンテンツのアドレス指定)ハッシュ値の提出ニックス包装レポは似ている「分離されたヘッド状態」:Nix 式の観点からは、各パッケージ定義はリリースコミット時点の最新バージョンです。
たとえば、固定Nixpkgsパッケージセットを参照する場合39cd40f
(2017年9月29日)「最新」バージョンは次のとおりです。
git
:2.14.2(現在 2.39.1)htop
:2.0.2(現在3.2.2)
警告する
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はパッケージ名(または再帰的)です。スーツ)値はニックス派生。
例:
- ニックス包装
- NUR(Nixユーザーストア)
- イーサリアムニックス
- nixos.wikiから代替パッケージページ:
- ニック・スパークス- クロスコンパイルに焦点を当てます。
- トリトン- バラよりNixpkgとTritonの違い
- ニックスWRT- nixpkgsベースのnixを使用したルータイメージの構築
- ~から
awesome-nix-hpc
リスト:- フラットアイアン研究所:https://github.com/platironinstitute/nix-modules
- グリッド:https://github.com/Gricad/nix-ciment-channel
- ブルーブレインプロジェクト:https://github.com/BlueBrain/bbp-nixpkgs
- カナダの計算:https://github.com/ComputeCanada/nixpkgs/tree/computecanada-16.09
- カナダの計算:https://git.computecanada.ca/nix/ccpkgs
- データ移動:https://github.com/oar-team/nur-kapack
- 量子化学パッケージ:https://github.com/markuskowa/NixOS-QChem
2. 例
nix-shell
2.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:ハッシュを使用してバージョンをインストールする
目的のバージョン行でハッシュをクリックします(例:git
2.23.0そしてhtop
2.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-config
Jwiegleyリポジトリのファイル;まだ理解していないのに含めたいです。
3. 追加資料
まだ進化しているこのトピックを取り巻くオンラインディスカッション:
github
Nixpkgs 問題 #9682(閉鎖):特定のパッケージバージョンをインストール/使用できませんか?2015年に開設されました。現在は閉鎖されていますが、問題は解決しなかったので、トピックは次の号に移されました。
github
Nixpkgs 問題 #93327(開いている):特定のパッケージバージョンを参照する明確な標準的な方法はありません。discourse
個別パッケージバージョンの固定ベストプラクティスdiscourse
shell.nix
?にパッケージのバージョンを指定してください。
(もっと多くの例でこれを拡張したいと思います。)
答え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。この構成では、バージョンが非常に古く、いくつかのエラーが発生したため、最新バージョンを使用しました。