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


索引

名称
描述
支持的 EAPIS
示例
函数
ECLASS 变量
作者
维护者
报告 Bug
文件
另请参见

本文件由 man2html 使用手册页创建。
时间:2024 年 11 月 12 日,格林威治标准时间 03:27:01