最近在Golang项目编码中尝试去解决一个单项目多模块的问题,即工程目录形如下面这种:
Project
-Dir_A
main.go
go.mod
go.sum
-Dir_B
main.go
go.mod
go.sum
...
一开始使用Goland进行编码,在IDE层面自动帮助解决掉了多模块开发的问题,在每个模块中的go.mod进行replace,也无大碍。最近对Golang版本进行升级,同时切换至Vscode进行编码,发现Vscode对这种类型的项目会报错:
去找了一些解决方案,类似手动设置
golps开关,即:
"gopls": {
"build.experimentalWorkspaceModule": true
}
但是,这个玩意已经弃用了,也是说没啥用:
在这种情况下想起来Go1.18曾经更新过类似的功能——go.work,遂去详细了解学习了一下,并应用于现在的项目中。
先决条件
-
Go1.18及以上版本
实际使用
工作区的重构
这里我们假设已经有了一个上面提到的目录结构的项目
# 进入目录
cd Project
随后我们可以删除go.mod中曾经手动添加的replace,不再需要这些东西来进行本地开发,取而代之的是,我们可以添加一个 go.work 文件:
Project
-Dir_A
main.go
go.mod
go.sum
-Dir_B
main.go
go.mod
go.sum
go.work
...
随后执行命令:
go work use -r Dir_A Dir_B
执行完成后可以看到 go.work 文件中会多出内容:
use (
./Dir_A
./Dir_B
)
这样IDE不会再报错,同时程序可以正常运行
go work相关命令
- 初始化
go work init
运行该命令会在workspace目录下生成一个 go.work 文件,无需手动创建。
如果在上层级目录已经初始化了 go.work,那么下级目录就无法再继续创建。
- 查看目录
go env GOWORK
通过此命令可以查看 go.work 所在位置
- 模块关联注入
go work use [-r] [a] [b] [c]...
在workspace目录下将多个模块关联注入到 go.work 文件中,其中 -r 表示递归查找
- 模块删除
go work -dropedit=Project
通过该命令移除模块信息
-格式化
go work edit -fmt go.work
经过一系列操作,在本地开发多模块项目更加舒服了,不需要在手动修改 go.mod,快去试试吧!