如何借助主项目根目录vendor运行本地Go模块MyExporter的测试?
问题描述
项目目录结构
bitbucket.com |__agent |__Exporter | |__MyExporter | |__factory.go | factory_test.go | go.mod |__Runner | |__main.go | main_test.go |__Vendor | |__bitbucket.com/agent/exporter/myexporter | |__factory.go |__go.mod
模块配置
- MyExporter的
go.mod:
module bitbucket.com/agent/exporter/myexporter
- 主模块agent的
go.mod:
module bitbucket.com/agent require ( bitbucket.com/agent/exporter/myexporter ) replace bitbucket.com/agent/exporter/myexporter => ./exporter/myexporter
遇到的问题
- 执行
go test -mod=vendor ./...仅运行main_test.go的测试,不执行MyExporter的测试; - 执行
go test -mod=vendor exporter/myexporter报错:package exporter/myexporter is not in GOROOT; - 执行
go test -mod=vendor bitbucket.com/agent/exporter/myexporter提示无测试文件; - 切换到
Exporter/MyExporter目录执行go test ./...正常,但执行go test -mod=vendor ./...因vendor在agent根目录失败; - 执行
go test -mod=vendor ./exporter/myexporter/报错:main module (bitbucket.com/agent) does not contain package bitbucket.com/agent/exporter/myexporter。
需求:借助agent根目录的Vendor目录运行MyExporter的测试,不在MyExporter内创建独立vendor目录。
解决方案
1. 修正路径大小写匹配问题
主模块go.mod中的replace指令路径与实际目录结构大小写不匹配(实际目录为Exporter/MyExporter,指令中写的是./exporter/myexporter),这是核心问题之一。
修改主模块go.mod的replace指令:
replace bitbucket.com/agent/exporter/myexporter => ./Exporter/MyExporter
2. 更新Vendor目录包含测试相关文件
默认go mod vendor不会将项目自身的测试文件和测试依赖加入vendor目录,需要添加-include-test参数生成完整的vendor内容:
在agent根目录执行:
go mod vendor -include-test
执行后,Vendor/bitbucket.com/agent/exporter/myexporter目录下会包含factory_test.go文件。
3. 执行MyExporter的测试
在agent根目录执行以下命令即可借助主模块的vendor目录运行MyExporter的测试:
go test -mod=vendor bitbucket.com/agent/exporter/myexporter
备选方案(无需切换目录)
如果不想修改vendor目录,也可以直接在MyExporter目录下指定使用主模块的go.mod和vendor:
切换到Exporter/MyExporter目录后执行:
go test -mod=vendor -modfile=../../go.mod ./...
该命令会强制使用agent根目录的go.mod配置和vendor依赖,无需在子模块内创建vendor。
内容的提问来源于stack exchange,提问作者Ruturaj
相关产品推荐
相关产品推荐

