Skip to main content

使用 Go Work 管理多个项目模块

·525 words·2 mins

在 Go 编程中,有时我们需要跨模块工作,这可能会变得相当复杂。为了使用最新的本地依赖项,我们需要使用 replace 语句。必须时刻保持警惕,避免将 replace 语句提交到远程仓库,但有时我们也会忘记,这会导致一些令人沮丧的情况。

我曾经羡慕 Rust 有 workspace 的概念来进行跨模块开发。最近,我发现 Go 也有类似的概念!通过使用 go work 命令,你可以创建一个 workspace,允许还要多个模块共享依赖项,而无需使用 replace 语句。这简直太棒了!

如何使用 go work #

假设我们要有以下模块:

.
├── main
├── pkg1
└── pkg2

main 模块是我们的应用程序,而 pkg1 和 pkg2 是 main 使用的模块。现在,让我们设置一个 workspace:

$ go work init main pkg1 pkg2

如果已经初始化,则执行:

$ go work use [-r] [main pkg1 pkg2 ...]

如果这些模块有其他外部依赖项或有任何更改,则执行:

$ go work sync 

执行后,将生成一个名为 go.work 的文件:

go 1.24.4

use (
	./main
	./pkg1
	./pkg2
)

如果这些模块有外部依赖项,还会生成一个名为 go.work.sum 的文件。

之后,你就可以调用本地的 pkg1pkg2 模块,而无需使用 replace 语句。这真的让很多事情变得非常方便。我非常感谢 Go 团队所做的一切,这项工作让 Go 语言变得更好。

go work 中的 replace #

有趣的是,Go work 中也有 replace 语句,它看起来像这样:

go 1.24.4

use (
	./main
	./pkg1
	./pkg2
)

replace ( 
  github.com/marsevilspirit/example => ./example
)

我个人觉得只用 use 就足够了。我还没在 go.work 中用过 replace 语句,可能有一些我不知道的特殊用例吧。