理由を見つけようとしています。nix-build
予期した出力を生成できません。。フォークを構築するために使用されたnixpkgsのバージョンを確認する方法はありますか?nix-build --verbose
ある時点で nixpkgs ハッシュを印刷するのと同じです。
ユースケースの場合は{pkgs ? import ./nixpkgs.nix}
どうすればよいですか?知る~に関係なく何pkgs
この派生のパラメータを提供しますか?現在のオペレーティングシステムにnixpkgsを使用してフォークを構築したら、パラメータを指定したものが必要ですpkgs
。 nixpkgsが定義された状態でビルドされているnixpkgs.nix
場合いいえもし。どのような場合かを手動で把握することは非常に退屈な作業です。
- nixpkgsから派生したすべての依存関係を見る
- 各依存関係について、
nixpkgs.nix
オペレーティングシステムとnixpkgsバージョンに異なるハッシュがあることを確認してください。 - ハッシュが異なる場合は、そのハッシュがどのnixpkgから来たかを確認し、nixpkgsが使用されたと結論付けます。
- ハッシュが同じ場合は続行
もちろん、すべての依存関係のハッシュが両方のnixpkgsバージョンで同じであれば、これは重要ではないかもしれませんが、少なくとも多くの手動操作なしでこの問題を解決できることをお勧めします。
外部詐欺。
答え1
nixpkgs
どちらが使用されているかを尋ねることは、他の変数と同様に単なる変数であるため、明確に定義されていない可能性がありnix-build
ますnixpkgs
(URL、ローカルファイル、チャネル、単純な属性セットからその値を取得できます)。実際には、同じリポジトリに nixpkgs の複数のインスタンスを持つこともできます。さまざまな方法で nixpkgs バージョンを見つけることができます。
方法1:nixpkgsがどのチャンネルから来たのかを知っていて(例えば<nixpkgs>
)、チャンネルが指すコミットを確認したい場合:
$ nix-instantiate --eval -E '(import <nixpkgs> {}).lib.version'
"22.11pre405560.2da64a81275"
(最後の数字はnixpkgsのコミットなので、nix eval
代わりに使用できますが、nix-instantiate
そのインターフェースは私が知っている限りそれほど安定していません。)
以下を使用してパスを取得することもできます。
$ nix-instantiate --eval -E '(import <nixpkgs> {}).path'
/nix/store/p5jayhh78vbq7kpw6p3m1s61g365zwam-nixos/nixos
方法2:定義された場所でさえ、不明なより複雑な派生の場合は、次のようにnixpkgs
他の変数のようにデバッグできますbuildins.trace
。
より正確な例を得るために、ファイルが次のようになるとしましょう。
{
pkgs ? import <nixpkgs> {}
}:
pkgs.hello
その後、次を使用してpkgs値を確認できます。
{
pkgs ? import <nixpkgs> {}
}:
builtins.trace (pkgs.lib.version) pkgs.hello
コンパイルすると、次のような結果が得られます。 nixpkgsへのコミットは次のとおりです2da64a81275
。
$ nix-build a.nix
trace: 22.11pre405560.2da64a81275
/nix/store/y4mxrg8c6l09lb2szl69vwl4f6441i5k-hello-2.12.1
より多くのデバッグ機能については、以下を参照してください。ここ。
PS:nixは怠惰な言語であり、必要なものだけを評価することを忘れないでください。したがって、変数が使用されない場合、その変数のトレースは呼び出されません。
$ cat a.nix
{
pkgs ? import <nixpkgs> {}
}:
let
x = builtins.trace (pkgs.lib.version) 2; # <-- never needed
in
pkgs.hello
$ nix-build a.nix
/nix/store/y4mxrg8c6l09lb2szl69vwl4f6441i5k-hello-2.12.1
方法3:フォークのすべての依存関係を知りたい場合、nixpkgsバージョンに気を付けない場合(すべてのフォークが内部的に与えられたものを呼び出してからnixpkgs
入力を上書きすることができます):
$ nix show-derivation $(nix-instantiate default.nix)
{
"/nix/store/g6qkwa2xaq6i40cwl9bpjxi19m7q8121-hello-2.12.1.drv": {
"outputs": {
"out": {
"path": "/nix/store/y4mxrg8c6l09lb2szl69vwl4f6441i5k-hello-2.12.1"
}
},
"inputSrcs": [
"/nix/store/9krlzvny65gdc8s7kpb6lkx8cd02c25b-default-builder.sh"
],
"inputDrvs": {
"/nix/store/0na7ivzsc073j4kpn9kqnvd2zvwb8g0a-hello-2.12.1.tar.gz.drv": [
"out"
],
"/nix/store/1av43alhcb8a894sz2cnnf9aldfdyb0h-stdenv-linux.drv": [
"out"
],
"/nix/store/6pj63b323pn53gpw3l5kdh1rly55aj15-bash-5.1-p16.drv": [
"out"
]
},
"system": "x86_64-linux",
"builder": "/nix/store/1b9p07z77phvv2hf6gm9f28syp39f1ag-bash-5.1-p16/bin/bash",
"args": [
"-e",
"/nix/store/9krlzvny65gdc8s7kpb6lkx8cd02c25b-default-builder.sh"
],
"env": {
"buildInputs": "",
"builder": "/nix/store/1b9p07z77phvv2hf6gm9f28syp39f1ag-bash-5.1-p16/bin/bash",
"cmakeFlags": "",
"configureFlags": "",
"depsBuildBuild": "",
"depsBuildBuildPropagated": "",
"depsBuildTarget": "",
"depsBuildTargetPropagated": "",
"depsHostHost": "",
"depsHostHostPropagated": "",
"depsTargetTarget": "",
"depsTargetTargetPropagated": "",
"doCheck": "1",
"doInstallCheck": "",
"mesonFlags": "",
"name": "hello-2.12.1",
"nativeBuildInputs": "",
"out": "/nix/store/y4mxrg8c6l09lb2szl69vwl4f6441i5k-hello-2.12.1",
"outputs": "out",
"patches": "",
"pname": "hello",
"propagatedBuildInputs": "",
"propagatedNativeBuildInputs": "",
"src": "/nix/store/pa10z4ngm0g83kx9mssrqzz30s84vq7k-hello-2.12.1.tar.gz",
"stdenv": "/nix/store/bj5n3k01mq8bysw0rcdm7jxvhc620pd3-stdenv-linux",
"strictDeps": "",
"system": "x86_64-linux",
"version": "2.12.1"
}
}
}
その他のデバッグツール
デバッグするには、派生したソースコードを読んだり、nix-shell
手順を手動で実行したり、次のようなさまざまなツールを使用する必要があるかもしれませんbuiltins.trace
。この議論例えば)。