什么是 go 工作区以及如何使用它们?
我之前写过一篇博文,介绍过Go 1.18 版本中添加的泛型。此版本还添加了另一项改进,称为“Go 工作区”。
在这篇博文中,我们将探讨什么是 Go 工作区以及如何使用它们。
如果您喜欢这篇博文并希望获得更多精彩的 Go 内容,请访问bytesizego.com
去修改替换
你是否曾经想过修改代码所依赖的 Go 模块?在 Google 上搜索之后,你可能会发现自己正在做类似以下的事情:
module test1.18
go 1.18
require golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
replace golang.org/x/sync => ./local/sync
这应该就是我们需要的全部了。为了测试,我把代码从 复制golang.org/x/sync
到./local/sync
。我的文件树如下所示: 然后对errgroup 的函数做了一些小改动:Go
正如预期的那样,当我运行程序时,我得到以下输出:
2022/03/21 07:58:10 Let's go!
2022/03/21 07:58:10 did a thing
太好了,一切正常!
在 Go 1.18 之前,这几乎是一次性修改多个模块的唯一方法。你需要记住在go.mod
提交代码之前移除修改。
介绍工作区
有了工作区,整个过程就变得简单多了。我们可以创建一个go.work
文件,其功能与之前使用的指令完全相同replace
。让我们再次遵循相同的示例,但这次使用工作区文件。
我的 go.mod 文件恢复如下:
module test1.18
go 1.18
require golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
go.work
然后,我在项目根目录下创建一个名为 的新文件,并添加以下内容:
go 1.18
use ./local/sync
就是这样!go 工具会自动检测工作区文件并使用它。运行时,go run ./workspace/main.go
我得到了和之前相同的输出:
2022/03/21 08:03:43 Let's go!
2022/03/21 08:03:43 did a thing
在 Go 1.18 Beta 中,您可以运行:
go build -workfile=off ./workspace/main.go
不使用工作文件来构建代码,但这在正式版中对我来说不起作用。我在这里提出了一个针对 Go 工具的 bug ,但它似乎在正式版发布前就被移除了,真是太可惜了。
现在正确的做法是运行以下命令:
GOWORK=off go run ./workspace/main.go
这样我们就得到了以下输出:
2022/03/21 08:27:03 did a thing
这表明它现在正在使用我们的 go.mod 文件中的原始模块进行构建。
最佳实践和警告
社区早期的帖子建议go.work
最好不要提交文件。这很合理,因为它用于本地开发,在对模块进行更改并测试后,您应该go.mod
像往常一样推送、标记,然后在文件中引用它。因此,共享go.work
文件是没有意义的。
考虑添加go.work
到您的.gitignore
。
不过需要注意的是,如果您确实推送了go.work
文件,运行它时似乎go build
会默认使用该文件,除非您明确关闭此功能。这可能会导致生产版本意外地包含开发代码。因此,为了安全起见,go.work
最好始终在生产版本中运行此功能。GOWORK=off go build ./...
包起来
希望这篇文章对你有帮助。想了解更多 Go 的趣闻,可以在这里找到我的 Twitter。
鏂囩珷鏉ユ簮锛�https://dev.to/gophers/what-are-go-workspaces-and-how-do-i-use-them-1643