GO-MODULE.ECLASS
章节:eclass-manpages (5)更新:2024 年 11 月
索引 返回主内容
名称
go-module.eclass - 用于构建作为 Go 模块编写的软件的基本 eclass描述
此 eclass 提供了所有使用模块以 Go 编程语言编写的软件所需的基本设置和功能。如果您要打包的软件在其顶级目录中有一个名为 go.mod 的文件,则它使用模块。自 1.16 版本以来,模块已成为 Go 编写软件中跟踪依赖项的首选方法,因此,如果软件未使用模块,则应进行更新。
此外,如果顶级 go.mod 文件包含指定 1.14 之前版本的 go 的 go 指令,则应将其报告给上游并进行更新。
如果软件在其顶级目录中有一个名为 vendor 的目录,则您需要做的唯一事情就是继承 eclass。如果没有,您还需要创建一个依赖项 tarball 并将其托管在某个位置,例如您的开发空间中。建议使用支持并行解压缩的格式,开发人员应使用更高级别的压缩,例如 xz 的 '-9'。
以下是如何创建依赖项 tarball 的示例。GOMODCACHE 设置中的基本目录必须为 go-mod,以便与此 eclass 中的设置匹配。
$ cd /path/to/project $ GOMODCACHE="${PWD}"/go-mod go mod download -modcacherw $ XZ_OPT='-T0 -9' tar -acf project-1.0-deps.tar.xz go-mod
由于 Go 程序是静态链接的,因此您的 ebuild 的 LICENSE= 设置必须包含所有静态链接依赖项的许可证非常重要。因此,请确保它是准确的。您可以使用 dev-go/lichen 等实用程序(需要网络连接)从编译后的二进制文件中提取此信息。
支持的 EAPIS
7 8示例
inherit go-module SRC_URI="https://github.com/example/${PN}/archive/v${PV}.tar.gz -> ${P}.tar.gz" Add this line if you have a dependency tarball. SRC_URI+=" ${P}-deps.tar.xz"
函数
- ego [<args>...]
- 调用 go,传递提供的参数。如果 go 失败,此函数将退出。它还支持通过“nonfatal”调用。如果您需要在您的 ebuild 中直接调用 go,则应使用此方法。
- go-module_set_globals
- 转换 EGO_SUM 中的信息以供 ebuild 中的其他用途。-填充可以添加到 SRC_URI 的 EGO_SUM_SRC_URI -导出 _GOMODULE_GOSUM_REVERSE_MAP,它提供从
发行文件 返回到 SRC_URI 的相对部分的逆映射, 根据 需要 用于
GOPROXY=file:///... - go-module_setup_proxy
- 如果您的 ebuild 重新定义了 src_unpack 并使用了 EGO_SUM,则需要在 src_unpack 中调用此函数。它在适当的位置设置 go 模块代理。
- go-module_src_unpack
- 为系统设置 GOFLAGS,然后根据以下规则进行解包:1. 如果设置了 EGO_SUM,则解包基本 tarball(s) 并设置
本地 go 代理。 此 模式 已 弃用。2. 否则,如果设置了 EGO_VENDOR,则退出,因为此功能已删除。3. 否则,调用“ego mod verify”,然后执行正常的解包操作。通过 go-env 设置编译环境。 - _go-module_src_unpack_gosum
- 使用来自 EGO_SUM 的发行文件填充 GOPROXY 目录层次结构,并解包基本发行文件。
导出 GOPROXY 环境变量,以便 Go 调用能够正确地获取目录。
- _go-module_gosum_synthesize_files
- 给定路径和版本,填充所有不需要直接下载的 Goproxy 元数据文件。- .../@v/${version}.info - .../@v/list
- _go-module_src_unpack_verify_gosum
- 验证 EGO_SUM 声明的 Go 模块是否足以覆盖构建包,而无需实际构建它。
- go-module_live_vendor
- 此函数用于实时 ebuild,在上游未提供供应商时提供依赖项的供应商。
ECLASS 变量
- EGO_SUM
- 这将被依赖项 tarball 替换,有关如何创建依赖项 tarball,请参见上文。
此数组基于您要打包的软件的顶级目录中的 go.sum 文件的内容。每个条目都必须用引号括起来,并包含 go.sum 中一行的前两个字段。
您可以使用 sed/awk/cut 的某种组合来提取 EGO_SUM 的内容,或使用 dev-go/get-ego-vendor 工具。
一种手动执行此操作的方法如下
cat go.sum | cut -d" " -f1,2 | awk '{print "
go.sum 的格式在上游此处进行了描述:https://golang.ac.cn/ref/mod#go-sum-files
为了包含在 EGO_SUM 中,此时应省略 h1: 值和其他将来的扩展。EGO_SUM 解析器将接受它们以方便创建 ebuild。
h1:<hash> 是上游 Go 使用的 Hash1 结构 Hash1 比 Gentoo 发行文件散列更稳定,并且上游警告说,在概念上,Hash1 值可能保持稳定,而上游 zip 文件发生变化。以下是一些不会更改 h1: 散列但会更改文件所有字节的常规校验和的示例:- zipfile 中不同的 mtimes - zipfile 中不同的文件名排序 - zipfile 中不同的压缩参数 - zipfile 中不同的额外字段
对于 Gentoo 使用,此 eclass 的作者认为,此时不应将 h1: 散列包含在 EGO_SUM 中,以减少 ebuild 的大小。当出现 Go 模块发行文件冲突时,将重新考虑此立场,其中两个发行文件的 Hash1 值相同,但作为字节流的文件的校验和认为文件不同。
此决定不会削弱 Go 模块的安全性,因为 Go 会在包构建期间验证 go.sum 中 Hash1 值的副本。
- _GOMODULE_GOPROXY_BASEURI ?= mirror://goproxy/
- 用于从其获取模块文件的 Golang 模块代理服务。请注意,模块代理通常通过 Hash1 代码验证模块。
在中国,用户可能会发现默认列表中的一些镜像被阻止,并且应该在 /etc/portage/mirrors 中为 goproxy 显式设置一个条目为 https://goproxy.cn/ 或在中国未被阻止的其他镜像。有关更多详细信息,请参见 https://arslan.io/2019/08/02/why-you-should-use-a-go-module-proxy/
此变量并非旨在用于镜像的用户级配置,而是为了涵盖可能仅出于非技术原因存在于特定 Goproxy 服务器上的 go 模块。
此变量不应存在于用户级配置中,例如 /etc/portage/make.conf,因为它会违反元数据不变性!
我正在考虑删除此变量并仅在下面硬编码 mirror://goproxy,因此请不要依赖它。
- _GOMODULE_GOSUM_REVERSE_MAP
- 从 Gentoo 发行文件名称映射回上游发行文件路径。关联数组,以避免在填充 GOPROXY 目录结构时出现 O(N*M) 性能。
- GO_OPTIONAL (在继承之前设置)
- 如果在继承之前设置为非空值,则 ebuild 的 Go 部分将被视为可选。不会添加任何依赖项,也不会导出任何阶段函数。您需要设置 BDEPEND 并在您的 ebuild 中调用 go-module_src_unpack。
作者
William Hubbs <[email protected]>Robin H. Johnson <[email protected]>
维护者
William Hubbs <[email protected]>报告 Bug
请通过 https://bugs.gentoo.org/ 报告 Bug。文件
go-module.eclass另请参见
ebuild(5)https://gitweb.gentoo.org/repo/gentoo.git/log/eclass/go-module.eclass
索引
本文件由 man2html 使用手册页创建。
时间:2024 年 11 月 12 日,格林威治标准时间 03:27:01