在 GNU Guix 系统上摆弄了一段时间后,我最终在我的
/gnu/store/
中得到了几个“guile-3.0.9/”目录
ls -p /gnu/store | grep 'guile-3.0.9/'
10p9mh0h11z2gs2z72lqnxq96ln6a5x7-guile-3.0.9/
4gvgcfdiz67wv04ihqfa8pqwzsb0qpv5-guile-3.0.9/
84rvhd3j7pfqrh7717cv7ddv2dc8xad5-guile-3.0.9/
g8p09w6r78hhkl2rv1747pcp9zbk6fxv-guile-3.0.9/
rabsjkkm22xhz1vr5dh7r4ai98zprywx-guile-3.0.9/
sg2csvgqqc8r6519pyaqk6c4l1plh40f-guile-3.0.9/
由于它们的 base32 哈希前缀不同,我猜它们在构建时有不同的输入。我真的很想知道有关这些软件包的一些特定信息,例如:
由于我总是使用替代服务器,因此我尝试从
"ci.guix.gnu.org"
网站获取信息。我实际上发现 https://ci.guix.gnu.org/build/2076542/details 的构建输出是“4gvgcfdiz67wv04ihqfa8pqwzsb0qpv5-guile-3.0.9”。但我对其他项目就不那么幸运了。从 CI 网站上很难找到特定的商店商品。
所以我的问题是:如果我有一个 gnu 商店项目,我如何以及在哪里可以获得它的相关信息?
PS。我知道有些包只是死的东西,当我运行时会被垃圾收集
guix gc
。
所以我的问题是:如果我有一个 gnu 商店项目,我如何以及在哪里可以获得它的相关信息?
大多数可用信息都可以从与商店项目对应的 .drv 文件中获取。
由于他们的base32哈希前缀不同,我猜他们在构建时有不同的输入。
正确,guix 存储项的哈希前缀是从派生的输入中派生出来的;所以如果这些改变,前缀也会改变。
哪个是新的,
虽然商店项目的 mtime 时间戳设置为 1 (00:00:01 1/1/1970 UTC),您可以使用例如在大多数情况下,ctime 或商店项目的出生时间戳来确定其年龄(假设在这种情况下这些已被可靠地设置):
(~) λ stat /gnu/store/x4m56h5qkim0pnvx6vgvp541mrdwdrah-guile-3.0.9/
File: /gnu/store/x4m56h5qkim0pnvx6vgvp541mrdwdrah-guile-3.0.9/
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 253,0 Inode: 5149742 Links: 7
Access: (0555/dr-xr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2024-01-21 03:04:50.000000000 +0100
Modify: 1970-01-01 01:00:01.000000000 +0100
Change: 2024-01-21 03:04:53.536941139 +0100
Birth: 2024-01-21 03:04:50.508934846 +0100
他们的构建输入是什么,
要了解这一点,您需要检查商店项目相应的 .drv 文件。如果我们想查看商店项目的构建输入
/gnu/store/x4m56h5qkim0pnvx6vgvp541mrdwdrah-guile-3.0.9/
,我们可以找到相应的 .drv 文件:
(~) λ grep -l 'x4m56h5qkim0pnvx6vgvp541mrdwdrah' /gnu/store/*guile*drv
/gnu/store/viypkfsq294qmhdakwcmjij3586yb8z6-guile-3.0.9.drv
然后打开它,例如文本编辑器或简单地将其打印到 STDOUT 来检查它。 Guix 中的 .drv 文件使用 ATerm 格式(请参阅第 1 章 ATerm 编程指南,了解有关该格式的更多信息)。
如果您想比较商店商品或漂亮地打印它们的输入以提高可读性,您可以使用
(guix derivations)
guile 模块。
有
read-derivation-from-file
可以将 .drv 文件读入 guile 记录(记录(Guile 参考手册));然后 .drv 文件的内容(或其中的一部分,例如 derivation-inputs
,如果您只想使用输入),可以漂亮地打印:
(use-modules (guix derivations)
(guix store)
(ice-9 pretty-print))
(let ((mydrv (read-derivation-from-file "/gnu/store/viypkfsq294qmhdakwcmjij3586yb8z6-guile-3.0.9.drv")))
(pretty-print (derivation-inputs mydrv)))
像这样:
(~/devel/store-diff)) λ guile inspect-derivation.scm | head -n 5
(#<<derivation-input> drv: #<derivation /gnu/store/3cbzvhhamvz491dh4j6nnj2y9rkqlnmm-libunistring-1.0.drv => /gnu/store/0jk7sl5xqwwdkzjpp9sxgz9z0d48a3vy-libunistring-1.0 /gnu/store/6x16x1030b7b4v9vz2fbr3v0fc5gni8g-libunistring-1.0-static 7fc2c8684e60> sub-derivations: ("out")>
#<<derivation-input> drv: #<derivation /gnu/store/6d15kljmay1q3dc3aaf58wfp6qkns3zf-pkg-config-0.29.2.drv => /gnu/store/jz5dwdxq4di29cd0rjjzkw356dhkzjil-pkg-config-0.29.2 7fc2c8637a00> sub-derivations: ("out")>
#<<derivation-input> drv: #<derivation /gnu/store/6iigxjcxl3har0w2pl3rqw4dsh6vqjmq-libffi-3.4.4.drv => /gnu/store/d7mbw8ga6nxg7bxcxsfhfh6fraj6i3bz-libffi-3.4.4-debug /gnu/store/w8b0l8hk6g0fahj4fvmc4qqm3cvaxnmv-libffi-3.4.4 7fc2c86495a0> sub-derivations: ("out")>
#<<derivation-input> drv: #<derivation /gnu/store/95ni9azjf87ypa9rcaarbx1hqsj2vmb7-libgc-8.2.2.drv => /gnu/store/hf00yhc42r93sfbpvcpxrl9i0flgk0rq-libgc-8.2.2-debug /gnu/store/1w1r6r56z9lhg8ghcb7lxss6mkn7d5l1-libgc-8.2.2 7fc2c86379b0> sub-derivations: ("out")>
#<<derivation-input> drv: #<derivation /gnu/store/cr1r72cbww33k2fzd4wwj83cnw1r3igw-glibc-2.35.drv => /gnu/store/0lzva77yj6hddmhasia65krknyi8kxsg-glibc-2.35-debug /gnu/store/gsjczqir1wbz8p770zndrpw4rnppmxi3-glibc-2.35 /gnu/store/l0yryi5jsa1grnvw01c9nkz9c81cv224-glibc-2.35-static 7fc2c8649fa0> sub-derivations: ("out")>
要获得两个推导的输入差异,您可以在两个推导的构建输入上使用
lset-difference
(srfi-1):
(use-modules (guix derivations)
(srfi srfi-1)
(ice-9 pretty-print))
(let ((adrv (read-derivation-from-file "/gnu/store/viypkfsq294qmhdakwcmjij3586yb8z6-guile-3.0.9.drv"))
(bdrv (read-derivation-from-file "/gnu/store/5svli5h2zfdyvx1cj65l02nqggnrdahx-guile-3.0.9.drv")))
(pretty-print (lset-difference eqv?
(derivation-inputs adrv)
(derivation-inputs bdrv))))
为什么它们在我的商店目录中等等
您可以使用
guix graph
(通过 -t referrers
或 -t references
)或 guix gc
(通过 --references
或 --referrers
)来检查。您可以用 guix graph
绘制 xdot
的输出,以检查您的商店商品与其他商店商品的关系: guix graph -t referrers /gnu/store/1gd9nsy4cps8fnrd1avkc9l01l7ywiai-guile-3.0.9 | guix shell xdot -- xdot -
以更好地了解它们为什么在您的商店中/哪个其他包将它们拉入为依赖等等。