如何 运行 在多模块 Go 项目中进行测试
How to run tests in a multimodule Go project
我正在学习围棋 Programming with Google Go。它有几个课程,每个课程都有几个模块。
我的项目如下所示(使用 https://ascii-tree-generator.com/ 制作):
google-golang/
├─ .github/
│ ├─ workflows/
│ │ ├─ ci.yml
├─ golang-getting-started/
│ ├─ module1/
│ │ ├─ main.go
│ │ ├─ main_test.go
│ ├─ module2/
│ │ ├─ trunc/
│ │ │ ├─ main.go
│ │ │ ├─ main_test.go
├─ .gitignore
├─ README.md
我想 运行 每次提交 *_test.go
文件中的所有测试,但我不清楚该怎么做从根目录 (google-golang
)。我认为不需要一个模块导入另一个模块,因为练习可以独立完成。 有两个答案,一个建议使用子模块,另一个建议使用 Go workspace,但都没有提供像我这样的新手可以学习的具体说明。
我不是在寻求有关 GitHub 操作的帮助,我知道如何编写这些操作。我正在寻找一个或多个可以找到并 运行 测试的命令。
您似乎对什么是模块感到困惑。根据经验,一个 go.mod
文件等于一个模块。 Go Wiki, gomod:
A module is defined by a tree of Go source files with a go.mod file in the tree's root directory.
根据问题中显示的目录树,看不到 go.mod
文件,因此没有 Go 模块。事实上,如果您尝试从 google-golang
或 golang-getting-started
中 运行 执行 module-aware 命令,您将得到:
go: go.mod file not found in current directory or any parent directory; see 'go help modules'
如果你想 运行 从 multi-module 回购的根目录进行所有测试,正如你问题的标题所说,使用 Go 1.17 你可以:
- 初始化 sub-modules:
$ cd google-golang/golang-getting-started/module1
$ go mod init example.com/module1
$ cd ../module2
$ go mod init example.com/module2
- 从 multi-module 项目的根目录使用 the trick suggested by Cerise Limón
$ cd google-golang
$ find . -name go.mod -execdir go test ./... \;
如果您实际上并不关心将 sub-repos 保留为单独的模块,您可以在根存储库中初始化一个模块,然后 运行 从那里进行所有测试:
$ cd google-golang # or google-golang/golang-getting-started/
$ go mod init example.com/mainmod
$ go test ./...
...然而,即使这个 hack 现在有效,它也没有多大意义,因为你的名为 moduleN
的回购有 main.go
个文件,其包应该命名为 main
,在他们每个人中。所以它们确实被组织为单独的 sub-modules.
我正在学习围棋 Programming with Google Go。它有几个课程,每个课程都有几个模块。
我的项目如下所示(使用 https://ascii-tree-generator.com/ 制作):
google-golang/
├─ .github/
│ ├─ workflows/
│ │ ├─ ci.yml
├─ golang-getting-started/
│ ├─ module1/
│ │ ├─ main.go
│ │ ├─ main_test.go
│ ├─ module2/
│ │ ├─ trunc/
│ │ │ ├─ main.go
│ │ │ ├─ main_test.go
├─ .gitignore
├─ README.md
我想 运行 每次提交 *_test.go
文件中的所有测试,但我不清楚该怎么做从根目录 (google-golang
)。我认为不需要一个模块导入另一个模块,因为练习可以独立完成。
我不是在寻求有关 GitHub 操作的帮助,我知道如何编写这些操作。我正在寻找一个或多个可以找到并 运行 测试的命令。
您似乎对什么是模块感到困惑。根据经验,一个 go.mod
文件等于一个模块。 Go Wiki, gomod:
A module is defined by a tree of Go source files with a go.mod file in the tree's root directory.
根据问题中显示的目录树,看不到 go.mod
文件,因此没有 Go 模块。事实上,如果您尝试从 google-golang
或 golang-getting-started
中 运行 执行 module-aware 命令,您将得到:
go: go.mod file not found in current directory or any parent directory; see 'go help modules'
如果你想 运行 从 multi-module 回购的根目录进行所有测试,正如你问题的标题所说,使用 Go 1.17 你可以:
- 初始化 sub-modules:
$ cd google-golang/golang-getting-started/module1
$ go mod init example.com/module1
$ cd ../module2
$ go mod init example.com/module2
- 从 multi-module 项目的根目录使用 the trick suggested by Cerise Limón
$ cd google-golang
$ find . -name go.mod -execdir go test ./... \;
如果您实际上并不关心将 sub-repos 保留为单独的模块,您可以在根存储库中初始化一个模块,然后 运行 从那里进行所有测试:
$ cd google-golang # or google-golang/golang-getting-started/
$ go mod init example.com/mainmod
$ go test ./...
...然而,即使这个 hack 现在有效,它也没有多大意义,因为你的名为 moduleN
的回购有 main.go
个文件,其包应该命名为 main
,在他们每个人中。所以它们确实被组织为单独的 sub-modules.