Go的多模块开发——1.18的特性go.work一年后才用上!

783 阅读2分钟

最近在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对这种类型的项目会报错:

image.png 去找了一些解决方案,类似手动设置golps开关,即:

"gopls": {
        "build.experimentalWorkspaceModule": true
    }

但是,这个玩意已经弃用了,也是说没啥用:

image.png

在这种情况下想起来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,快去试试吧!