포크를 만드는 데 어떤 nixpkg가 사용되는지 확인하는 방법은 무엇입니까?

포크를 만드는 데 어떤 nixpkg가 사용되는지 확인하는 방법은 무엇입니까?

이유를 알아내려고 노력 중이에요nix-build예상한 출력을 생성 할 수 없습니다.. 포크를 빌드하는 데 사용된 nixpkgs 버전을 확인하는 방법이 있습니까? nix-build --verbose어느 시점에서 nixpkgs 해시를 인쇄하는 것과 같습니다.

사용 사례의 경우 {pkgs ? import ./nixpkgs.nix}어떻게 합니까?알다~에 관계없이무엇pkgs이 파생에 대한 매개변수를 제공하시겠습니까? 현재 운영 체제에 대해 nixpkgs를 사용하여 포크가 빌드되면 매개 변수를 제공한 것이 있어야 합니다 pkgs. nixpkgs가 정의된 상태로 빌드된 nixpkgs.nix경우아니요만약에. 어떤 경우인지 수동으로 파악하는 것은 매우 지루한 작업입니다.

  1. nixpkgs에서 파생된 모든 종속성 보기
  2. 각 종속성에 대해 nixpkgs.nix운영 체제 및 nixpkgs 버전에 다른 해시가 있는지 확인하십시오.
  3. 해시가 다른 경우 해당 해시가 어느 nixpkg에서 왔는지 확인하고 nixpkgs가 사용되었다고 결론을 내립니다.
  4. 해시가 동일하면 계속

물론 모든 종속성 해시가 두 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.이 토론예를 들어).

관련 정보