go - 构建不包括测试模块
问题描述
我的项目具有以下结构:
├── 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 build
当 go 正常(或)构建一个包go install
时,它将忽略任何具有名称模式的文件*_test.go
。这意味着仅从这些测试文件中导入的任何包的目标代码都不会链接到您的可执行文件中。
因此,如果您只是小心不要从非测试代码中导入测试包,那您就很好。
如果您不确定,可以通过运行以下命令检查“构建列表”:
go list -m all
从模块的根目录。这将列出为构建提供包的模块集。
Ref: go - 主模块和构建列表
推荐阅读
- javascript - 如何在axios中传递url路径变量
- powershell - 找不到接受参数“=”错误的位置参数
- ffmpeg - 如何组合这些 FFMPEG 命令?
- google-apps-script - 当我点击通过 webapp 发送时,如何显示确认通知?
- swift - 将 RGBA32Float MTLTextures 转换为 NSImage
- dll - 将 Quarkus 应用程序编译为 DLL(库)
- mysql-notifier - MySql 未在“运行”符号上显示弹出窗口
- java - <<= 或 >>= 在 Java 中是什么意思?
- node.js - 为什么纱线 knex 没有在本地回购中迁移
- curl - 使用 curl,我可以使用 GET,但我不能使用 POST