构建排除测试模块
我的项目具有以下结构:
??? api
? ??? api.go
? ??? api_test.go
? ??? other_files...
??? cmd
? ??? main.go
在 cmd/main.go 下,我有我的 Go 项目的入口点。
由于我还创建了一些测试文件,因此我还有其他类用于测试目的。
我的 go.mod 就像:
require (
github.com/gorilla/mux v1.8.0
github.com/stretchr/testify v1.6.1 <-used for test
gotest.tools v2.2.0+incompatible <-used for test
k8s.io/api v0.19.0
k8s.io/apimachinery v0.19.0
k8s.io/client-go v0.19.0
)
我的疑问与构建阶段有关:
在做 时go build ./cmd/main.go,我是否只选择了正确的模块main.go以及他在代码中的所有引用,不包括go.mod用于测试类的未使用模块?
是否有任何ldd命令可以确保我只链接所需的模块?
我认为 Go 已经过优化,可以做到这一点,但我想确定这一点。
回答
当 go 正常(go build或go install)构建包时,它将忽略名称为 pattern 的任何文件*_test.go。这意味着仅从这些测试文件导入的任何包的目标代码将不会链接到您的可执行文件中。
因此,如果您只是小心不要从非测试代码中导入测试包,那您就很好。
如果您不确定,可以通过运行以下命令检查“构建列表”:
go list -m all
从模块的根目录。这将列出为构建提供包的模块集。
参考:go - 主模块和构建列表