使用多模块工作区,您可以告诉 Go 命令您正在 同时在多个模块中编写代码.
multi-module workspaces 多工作区模式,要求go版本 >= Go 1.18
需求分析
加入现在我们把一个大的项目分成了两个项目,一个项目是基础模块,用来实现项目的公用功能。第二个项目要依赖第一个项目,注意:这里提到的是项目,而不是模块。解决方法有二:
- 把第一个项目创建好,提交到github,第二个项目使用 go get 下载。
- 使用Golang1.18里面的新功能workspace。
第一种方法有一个缺陷就是,如果我们频繁的修改代码,那么第二个项目就要不停的更新,否则版本就不是最新的。而第二个方法就没有这个问题,项目可以在本地依赖。
实现步骤
- 建立项目目录
myworkspace - 在
myworkspace目录,建立common和myproject_1两个go mod子项目 - 在
myworkspace目录,使用命令go work init common初始化workspace多工作区模式 - 在
myworkspace目录,使用命令go work use myproject_1添加myproject_1目录到工作区 - 在
myworkspace目录,运行go run myproject_1/main.go。 也可编译myproject_1为二进制可执行文件
操作最终生成一个 go.work 文件
- 工作区目录,必须为
go mod项目,必须包含go.mod文件 - 工作区初始化可一次性添加多个目录。如:
go work init common myproject_1 - 实际项目中,多个模块之间可能还依赖其他模块,建议在 go.work 所在目录执行
go work sync
最终目录结构如下:
.
└── myworkspace
├── common
│ ├── common.go
│ └── go.mod
├── go.work
└── myproject_1
├── go.mod
└── main.go
3 directories, 5 files创建 myworkspace 主项目
mkdir myworkspace
cd myworkspace创建 common 子项目
mkdir common
go mod init common
vim common.gomyworkspace/common/common.go
package common
import "fmt"
func Dosomething() {
fmt.Println("do something...")
}创建 myproject_1 子项目
cd .. && mkdir myproject_1 && cd myproject_1
go mod init myproject_1
vim main.gomyworkspace/myproject_1/main.go
package main
import "common"
func main() {
common.Dosomething()
}
// package common is not in GOROOT初始化multi-module workspaces 多工作区
cd ..
go work init common继续往工作区里面添加工作区项目
go work use myproject_1结束
go work sync
go run myproject_1/main.gomulti-module workspaces https://go.dev/doc/tutorial/workspaces
Get familiar with workspaces https://go.dev/blog/get-familiar-with-workspaces
golang - 多模块工作区 https://www.jianshu.com/p/74e22177e114
Golang 1.18新特性工作区workspace https://blog.csdn.net/qq_39280718/article/details/126786485
沙滩星空的博客