어떤 nix 패키지가 특정 파일/바이너리/명령을 제공합니까?

어떤 nix 패키지가 특정 파일/바이너리/명령을 제공합니까?

어느 것이 무엇인지 어떻게 알 수 있습니까?닉스 PG-패키지는 시스템에 설치되지 않을 수 있는 특정 파일/명령을 제공합니까?

다른 패키지 관리자는 다음과 같이 이 기능을 제공합니다.

nix에도 비슷한 기능이 있나요?

맥락: 어떤 패키지가 그것을 제공했는지 알아내려고 노력하고 있었는데 grep, gnugrep그 패키지가 그것을 제공했다는 것을 깨달았습니다(누가 생각이나 했을까요?). 다음번에는 추측 게임을 하지 않기 위해 이런 질문에 답할 수 있는 체계적인 방법을 찾고 있습니다.

내가 시도한 것들:

답변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 코드에서 파생된 항목을 참조하는 데 사용하는 속성 경로와 정확히 동일하지는 않지만 여전히 좋은 단서입니다.

관련 정보