构建排除测试模块

Pri*_*sco -1 go dependency-management

我的项目具有以下结构:

??? api
?   ??? api.go
?   ??? api_test.go
?   ??? other_files...
??? cmd
?   ??? main.go
Run Code Online (Sandbox Code Playgroud)

在 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
)
Run Code Online (Sandbox Code Playgroud)

我的疑问与构建阶段有关:
在做 时go build ./cmd/main.go,我是否只选择了正确的模块main.go以及他在代码中的所有引用,不包括go.mod用于测试类的未使用模块?

是否有任何ldd命令可以确保我只链接所需的模块?
我认为 Go 已经过优化,可以做到这一点,但我想确定这一点。

Adr*_*ian 11

当你运行时go build,它会:

  • import检查正在为语句构建的包
  • 检查每个导入的包中的import语句
  • ...依此类推,直到找到所有传递依赖项。
  • 对于要构建的每个包,它会检查构建约束,并构建未排除的文件。*_test.go默认情况下排除文件,go test在构建测试时明确包含它们。

这意味着:

  • 除非您明确包含测试文件,否则测试文件不会包含在非测试版本中。
  • 未引用的包根本不会被包含在内。
  • 其中的内容go.mod与构建无关:它用于依赖项管理,而不用于编译。


Eze*_*uns 5

当 go 正常(go buildgo install)构建包时,它将忽略名称为 pattern 的任何文件*_test.go。这意味着仅从这些测试文件导入的任何包的目标代码将不会链接到您的可执行文件中。

因此,如果您只是小心不要从非测试代码中导入测试包,那您就很好。

如果您不确定,可以通过运行以下命令检查“构建列表”:

go list -m all
Run Code Online (Sandbox Code Playgroud)

从模块的根目录。这将列出为构建提供包的模块集。

参考:go - 主模块和构建列表