使用多模块工作区,您可以告诉 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.go
myworkspace/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.go
myworkspace/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.go
multi-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