构建排除测试模块

Build excluding test modules

我的项目结构如下:

├── 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 buildgo install),它将忽略任何名称模式为 *_test.go 的文件。这意味着仅从这些测试文件导入的任何包的目标代码将不会链接到您的可执行文件中。

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

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

go list -m all

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

参考:go - The main module and the build list

当您 运行 go build 时,它将:

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

这意味着:

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