如何在 Guix 项目中复用并扩展 manifest.scm?
技术老齐
可以用 concatenate-manifests 将 manifest.scm 求值后返回的 manifest 对象与新增软件包的 manifest 合并,再交给 guix shell -m 使用。
为什么 append 不适用?
原文件中的表达式:
(specifications->manifest (list "gcc-toolchain"))
返回的是 manifest 对象,通过 (load "manifest.scm") 加载该文件也会得到这个对象。
append 用于拼接列表。尝试的写法将 manifest 对象和字符串列表 (list "make") 放在一起,类型不匹配。需要先为 "make" 创建一个 manifest,再合并两个 manifest。
如何编写 manifest-alt.scm?
保留原来的 manifest.scm:
(specifications->manifest (list "gcc-toolchain"))
在同一目录创建 manifest-alt.scm:
(use-modules (guix profiles)
(gnu packages))
(concatenate-manifests
(list
(load "./manifest.scm")
(specifications->manifest (list "make"))))
(guix profiles) 提供 concatenate-manifests,(gnu packages) 提供 specifications->manifest。
代码加载基础文件返回的 manifest,并为 make 创建另一个 manifest,再用 concatenate-manifests 合并。这个函数接收一个包含多个 manifest 的列表,因此外层的 list 需要保留。
在两个文件所在的项目目录运行:
guix shell -m manifest-alt.scm
Guix 会根据合并后的 manifest 创建环境,其中包含基础文件声明的 gcc-toolchain 和新增的 make。
使用时需要注意什么?
- 基础文件的最后一个表达式应当返回 manifest。如果在后面添加其他表达式,
load的返回值可能会改变。 - 示例中的两个文件位于同一目录,命令也从该目录执行。调整目录结构时,需要检查
load的路径。 - 扩展文件的最终求值结果也必须是合并后的 manifest,不能只返回软件包名称列表。
需要添加多个软件包时,扩展名称列表即可:
(specifications->manifest (list "make" "pkg-config"))
备注:内容仅供参考。
