如何找到特定 guix 商店项目的构建信息

问题描述 投票:0回答:1

在 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 guix
1个回答
0
投票

所以我的问题是:如果我有一个 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 -
以更好地了解它们为什么在您的商店中/哪个其他包将它们拉入为依赖等等。

© www.soinside.com 2019 - 2024. All rights reserved.