在 Go 中使用测试依赖项但阻止导出它们的最佳方法

Gre*_*dge 18 testing go go-modules

给定一个 Golang (1.14+) 项目,该项目使用测试依赖项(如 github.com/stretchr/testify),现在假设该项目是一个可供其他人使用的公共库。

通常,当我现在使用时,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
Run Code Online (Sandbox Code Playgroud)

go mod tidy或者go mod download似乎还从使用的库下载所有测试依赖项。exclude但不是告诉每个人在他们的文件中使用,go.mod有没有办法甚至阻止它被导出?

bcm*_*lls 13

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 添加了对模块图修剪的支持:如果您的模块指定go 1.17或更高,并且模块的使用者不在自己的模块中使用您的测试依赖项,他们将不需要下载go.mod该依赖项的源代码或文件。(一旦实现了https://golang.org/issue/44435go mod download ,当他们运行时也不会下载不相关的依赖项。)