给定一个使用测试依赖项(如 github.com/stretchr/testify)的 Golang(1.14+)项目,现在假设该项目是一个可供其他人使用的公共(public)库。
通常当我现在使用 go mod graph
我总是会看到这样的依赖:
github.com/its-me/my-great-library@1.0.0
github.com/stretchr/testify@v1.6.1 github.com/davecgh/go-spew@v1.1.0
github.com/stretchr/testify@v1.6.1 github.com/pmezard/go-difflib@v1.0.0
github.com/stretchr/testify@v1.6.1 github.com/stretchr/objx@v0.1.0
github.com/stretchr/testify@v1.6.1 gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c
gopkg.in/yaml.v3@v3.0.0-20200313102051-9f266ea9e77c gopkg.in/check.v1@v0.0.0-20161208181325-20d25e280405
go mod tidy
或 go mod download
似乎也从使用的库中下载了所有测试依赖项。但不是告诉大家使用 exclude
在他们的go.mod
文件有没有办法防止它被导出?
最佳答案
go mod tidy
旨在提供运行 go test all
所需的所有依赖项.请注意,在 Go 1.16 中,go test all
对测试的传递依赖( https://tip.golang.org/doc/go1.16#all-pattern )会稍微不那么激进。
但是,如果您自己的测试本身使用 testify
,那么您的软件包的用户将需要下载 testify
为了运行go test all
在他们自己的模块中。
(正如 colm.anseo 所指出的,如果您愿意,可以将较重的测试拆分到一个单独的包中,这样当您的用户运行 go test all
时,他们将不会运行这些测试,也不需要下载这些依赖项的源代码。 )
请注意,Go 1.17 添加了对 module graph pruning 的支持: 如果你的模块指定 go 1.17
或更高版本并且您的模块的使用者不会在他们自己的模块中使用您的测试依赖项,他们不需要下载源代码或go.mod
该依赖项的文件。 (一旦 https://golang.org/issue/44435 被实现,当它们运行 go mod download
时,它也不会下载不相关的依赖。)
关于go - 在 Go 中使用测试依赖项但防止导出它们的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64071364/