이유를 알아내려고 노력 중이에요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
더 많은 디버깅 기능을 보려면 다음을 참조하세요.여기.
추신: 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
.이 토론예를 들어).