Nix 패키지의 저장 경로를 참조하는 방법은 무엇입니까?

Nix 패키지의 저장 경로를 참조하는 방법은 무엇입니까?

awscli명령완성 관련 기능을 추가하고 싶습니다 .

내 특별한 경우에는 에서 스크립트를 가져와야 합니다 /nix/store/hvx7xqvjz7r08nsb9kssh1d9s302v3sp-awscli-1.16.106/share/zsh/site-functions/aws_zsh_completer.sh.

/nix/store/hvx7xqvjz7r08nsb9kssh1d9s302v3sp-awscli-1.16.106package()()의 저장 경로를 얻는 방법은 무엇입니까 awscli? 왜냐하면 나는 이 참조를 하드코딩하는 것이 이상적이라고 생각하지 않기 때문입니다.

답변1

이를 사용하여 얻으려는 파일을 가리키는 configuration.nix심볼릭 링크를 만들 수 있습니다 . /etc그러면 방금 말한 심볼릭 링크를 받게됩니다. 예를 들면 이런 것...

구성.nix

environment.etc."zsh/zshrc".source = "${pkgs.awscli}/share/zsh/site-functions/aws_zsh_completer.sh";

/etc/zsh/zshrc...다음을 가리키는 심볼릭 링크를 생성합니다./nix/store/hvx7xqvjz7r08nsb9kssh1d9s302v3sp-awscli-1.16.106/share/zsh/site-functions/aws_zsh_completer.sh

이는 를 통해 수행되므로 configuration.nix시스템이 구축될 때마다 심볼릭 링크가 올바른 경로로 업데이트됩니다.

그런 다음 /etc/zsh/zshrc이를 ~.zshrc.

답변2

이를 설치 한 nix-locate후 다음 명령을 사용하여 데이터베이스를 업데이트합니다 nix-index.

nix-locate "PATTERN"

답변3

nix eval --raw패키지의 저장 경로를 인쇄하는 데 사용할 수 있습니다 . 귀하의 예를 들어:

ls $(nix eval --raw nixpkgs.awscli)/share/zsh/site-functions/aws_zsh_completer.sh

이 파일은 패키지가 이미 로컬 nix 스토어에 있는 경우에만 존재합니다.

⚠️2022년 6월에 nix 2.8.0으로 업데이트되었습니다.

명령이 더 이상 있는 그대로 작동하지 않습니다. 나는 그것을 업데이트하려고 시도했고 이것을 생각해 냈습니다.

ls $(nix --extra-experimental-features nix-command --extra-experimental-features flakes eval -f '<nixpkgs>' --raw 'awscli')/share/zsh/site-functions/aws_zsh_completer.sh

어쨌든, nix 패키지를 참조하기 위해 쉘 초기화를 설정하려는 경우 현재 사용하고 있는 해결 방법은 다음과 같습니다.

export NIX_PROFILE_ROOT=${NIX_PROFILES[(w)2]}
maybesource () {
    [[ -r $1 ]] && . $1
}

그런 다음 nix 구성 파일을 통해 패키지를 참조하십시오.

maybesource $NIX_PROFILE_ROOT/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

답변4

다른 문제에 부딪혔지만 이것이 DDG 결과에서 1위를 차지했으므로 nix store reference여기에 남겨두겠습니다. 내 문제는 패키지 내 다른 패키지의 특정 파일을 참조해야 한다는 것이 아닙니다. 내 패키지 buildInputs를 내 프로필에 설치할 수 있도록 특정 저장소 경로에 rundep()이 있어야 하지만 그들은 그렇게 하지 않습니다. GC 처리. (사용하면서 계속 경로를 다시 다운로드 받는 것도 지겹고 nix-shell, nix-env -iA nixpkgs.stdenv작업할 때는 nix-env -iA nixpkgs.bash분명히 다른 복사본이 나오네요.)

저장 경로를 텍스트 파일에 넣는 것만으로는 작동하지 않으며 $out먼저 전달해야 합니다.builtins.storePath

writeTextDir "share/nix-shell-nogc" (builtins.concatStringsSep "\n" (builtins.map builtins.storePath [
    "/nix/store/2r4gr92p49kpx48s0hxxxv04cqbx4d6c-bash-interactive-5.1-p16-dev"
    "/nix/store/76yin93c7c0jv29kq2hr39d5rzd0v6dg-bash-interactive-5.1-p16-doc"
    "/nix/store/d2m4s6bm6gxpwd22pv20cbhl3ikbhhpb-bash-interactive-5.1-p16-man"
    "/nix/store/p5fqinp9r82fr92rncwxmhd8nsk3igjy-bash-interactive-5.1-p16-info"
]))

또는 경로 리터럴을 사용하십시오(경로가 존재하지 않으면 빌드되지 않지만 위의 방법은 필요한 경우 빌드 중에 다운로드됩니다).

writeTextDir "share/nix-shell-nogc" ''
    ${/nix/store/2r4gr92p49kpx48s0hxxxv04cqbx4d6c-bash-interactive-5.1-p16-dev}
    ${/nix/store/76yin93c7c0jv29kq2hr39d5rzd0v6dg-bash-interactive-5.1-p16-doc}
    ${/nix/store/d2m4s6bm6gxpwd22pv20cbhl3ikbhhpb-bash-interactive-5.1-p16-man}
    ${/nix/store/p5fqinp9r82fr92rncwxmhd8nsk3igjy-bash-interactive-5.1-p16-info}
'';

나는 경로를 하드코딩하는 것을 좋아하지 않지만 작업은 완료됩니다.

관련 정보