어느 것이 무엇인지 어떻게 알 수 있습니까?닉스 PG-패키지는 시스템에 설치되지 않을 수 있는 특정 파일/명령을 제공합니까?
다른 패키지 관리자는 다음과 같이 이 기능을 제공합니다.
nix에도 비슷한 기능이 있나요?
맥락: 어떤 패키지가 그것을 제공했는지 알아내려고 노력하고 있었는데 grep
, gnugrep
그 패키지가 그것을 제공했다는 것을 깨달았습니다(누가 생각이나 했을까요?). 다음번에는 추측 게임을 하지 않기 위해 이런 질문에 답할 수 있는 체계적인 방법을 찾고 있습니다.
내가 시도한 것들:
nix-env -qa
패키지 이름만 검색- https://search.nixos.org/패키지 이름만 검색
답변1
패키지를 설치 nix-index
하고 인덱스를 작성한 후 nix-locate
다음 명령을 사용할 수 있습니다.
[nix-shell:~]$ nix-locate '/bin/grep'
perl532Packages.grepmail.out 75,569 x /nix/store/i4krsr02b3yymqhzz9kbz066rkjkn5zl-perl5.32.1-grepmail-5.3111/bin/grepmail
perl530Packages.grepmail.out 75,569 x /nix/store/vc2iv0zi7kb0fr04gahyx142i30xi0g6-perl5.30.3-grepmail-5.3111/bin/grepmail
patchutils_0_3_3.out 0 s /nix/store/yfl83agm8396xw9hir1rwvdanz13h9w5-patchutils-0.3.3/bin/grepdiff
patchutils.out 0 s /nix/store/wk1yk22f0f6ai478axaqr0yvwy6q7xl5-patchutils-0.3.4/bin/grepdiff
(patchutils.out) 248,584 x /nix/store/6jysbyhc43sjvfiyh1bpvi1n3zbz212r-bootstrap-tools/bin/grep
ipinfo.out 4,293,096 x /nix/store/7p4g03bi15705ipbkrc7vhb42cvgc54f-ipinfo-2.0.1/bin/grepip
grepm.out 1,540 x /nix/store/mfhzjhz2f3mwbg1pq1diblqfdcmcffhs-grepm-0.6/bin/grepm
grepcidr.out 19,576 x /nix/store/7x10lzg5389flnjhfwh4xycqi835knfy-grepcidr-2.0/bin/grepcidr
gnugrep.out 271,716 x /nix/store/ba3bf20z5rmd9vgyzsgamvwvb3i1idfn-gnugrep-3.6/bin/grep
(unixtools.col.out) 27,660 x /nix/store/0h4ih2jvl9gv3dnmld2vq5iyyv41cy7v-text_cmds-99/bin/grep
이것닉스 치트 시트Nix 및 Ubuntu에서 해당 명령의 유용한 목록을 제공합니다.
인덱싱에는 다소 시간이 걸립니다(네트워크 속도 및 크기에 따라 다름). --filter-prefix '/bin/'
유틸리티를 찾을 때 유틸리티를 사용하면 시간을 줄일 수 있습니다(제 경우에는 8:10 -> 2:50분). 셸을 호출한 직후에 인덱싱하면 상호 작용이 줄어들 수도 있습니다.
$ nix-shell -p nix-index --command 'nix-index --version; time nix-index --show-trace --filter-prefix '/bin/'; return'
Nixpkgs Files Indexer 0.1.3
+ querying available packages
+ generating index: 55661 paths found :: 23483 paths not in binary cache :: 08533 paths in queue
Error: fetching the file listing for store path '/nix/store/siv7varixjdfjs17i3qfrvyc072rx55j-ia-writer-duospace-20180721' failed
Caused by: response to GET 'http://cache.nixos.org/siv7varixjdfjs17i3qfrvyc072rx55j.ls' failed to parse (response saved to /run/user/1000/file_listing.json.2)
Caused by: expected value at line 1 column 1
+ generating index: 66306 paths found :: 23630 paths not in binary cache :: 00000 paths in queue
+ wrote index of 2,742,453 bytes
real 2m50,553s
user 2m39,151s
sys 0m26,571s
[nix-shell:~]$ nix-locate /bin/grep
...
(irccloud.out) 0 s /nix/store/dv7klxqz8pmyml05nrs5f5ddd3hb9nsw-irccloud-0.13.0-usr-target/bin/grep
fpc.out 732 r /nix/store/4p5nx2csq7xmag9cbkmg54qzj6kxr71j-fpc-3.2.0/bin/grep.tdf
gnugrep.out 257,000 x /nix/store/z3q9q9549ci7kbdgyq99r6crnvrky6v3-gnugrep-3.7/bin/grep
grepm.out 1,596 x /nix/store/746bg318dq0wm1z23lllbg74ymdyac3r-grepm-0.6/bin/grepm
grepcidr.out 22,088 x /nix/store/sja30zvm5nw7ic7gwddc3h89rdgiyza4-grepcidr-2.0/bin/grepcidr
...
답변2
패키지가 시스템 전체에 파일을 설치할 수 있도록 허용하는 다른 Linux 패키지 관리자와 달리 Nix는 패키지 이름을 딴 디렉터리에 패키지의 모든 파일을 저장합니다. 이 디렉토리는 내부에 위치하며 /nix/store
, 디렉토리 이름은 패키지가 정의된 위치에 대한 중요한 단서를 제공할 수 있습니다.
예를 들어, PATH에 호출된 유틸리티가 있고 그 유틸리티 nix-build
가 어디에서 왔는지 알고 싶다면 다음을 시도해 볼 수 있습니다.
$ realpath $(which nix-build)
/nix/store/5hdmx9yk7gr71b98j4vh9271k0zg5jis-nix-2.2.1/bin/nix
그러면 그것이 이라는 패키지에서 온다는 것을 알 수 있습니다 nix
. 대략적으로 말하면 이는 name
이를 정의하는 파생 코드의 필드입니다. 파생된 이름은 nixpkgs 코드에서 파생된 항목을 참조하는 데 사용하는 속성 경로와 정확히 동일하지는 않지만 여전히 좋은 단서입니다.