哪个 nix-package 提供给定的文件/二进制文件/命令?

哪个 nix-package 提供给定的文件/二进制文件/命令?

我怎样才能知道哪个尼克斯PG-package 提供给定的文件/命令,该文件/命令可能未安装在系统上?

其他包管理器提供此功能,如下所示:

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 分钟)。调用 shell 后立即建立索引也可以减少交互:

$ 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 代码中用来引用派生的属性路径并不完全相同,但它仍然是一个很好的线索。

相关内容