GO语言 | go work 神一般的管理 多个module没烦恼_“逛丢一只鞋”的博客-CSDN博客
Go1.18 新特性之多模块Multi-Module工作区模式_Golang | 忙忙碌碌网
go在1.18版本更新了一个超级重磅的功能,那就是work!Tutorial: Getting started with multi-module workspaces - The Go Programming Language
开始之前说明一下的我的go env
GOROOT=/usr/local/go
GOBIN=$GOROOT/bin
GOPATH=/home/liwu/project/gowork
#GOPROXY=https://goproxy.io,direct
GOPROXY=https://goproxy.cn,direct
GO111MODULE=on
GOSUMDB=off
GOFLAGS=-mod=readonly
PATH=$PATH:$GOBIN:$GOPATH/bin
export GO111MODULE GOSUMDB GOFLAGS GOPROXY GOPATH GOROOT GOBIN PATH
source /etc/profile
go work工作区模式
Go 1.18引入的工作区模式,可以让你不用修改每个Go Module的go.mod,就能同时跨多个Go Module进行开发。
工作区里的每个Go Module在解析依赖的时候都被当做根Module。
在Go 1.18以前,如果遇到以下场景:Module A新增了一个feature,Module B需要使用Module A的这个新feature,你有2种方案:
- 发布Module A的修改到代码仓库,Module B更新依赖的Module A的版本即可
- 修改Module B的go.mod,使用replace指令把对Module A的依赖指向你本地未发布的Module A所在目录。
等Module A发布后,在发布Module B的时候,再删除Module B的go.mod文件里的replace指令。
有了Go工作区模式之后,针对上述场景,我们有了更为简单的方案:你可以在工作区目录维护一个go.work文件来管理你的所有依赖。
go.work里的use和replace指令会覆盖工作区目录下的每个Go Module的go.mod文件,因此没有必要去修改Go Module的go.mod文件了。
go work用法介绍
Usage:
go work <command> [arguments]
The commands are:
edit edit go.work from tools or scripts
init initialize workspace file
sync sync workspace build list to modules
use add modules to workspace file
Use "go help work <command>" for more information about a command.
第一步 go work init
使用go work init来创建一个workspace,go work init 的语法如下所示:
go work init [moddirs]
moddirs是Go Module所在的本地目录。如果有多个Go Module,就用空格分开。
如果go work init后面没有参数,会创建一个空的workspace。
执行go work init后会生成一个go.work文件,go.work里列出了该workspace需要用到的Go Module所在的目录,
workspace目录不需要包含你当前正在开发的Go Module代码。
第二步骤 go work use
如果要给workspace新增Go Module,可以使用如下命令:
go work use [-r] moddir
moddir是Go Module所在的本地目录
或者手动编辑go work文件。
如果带有-r参数,会递归查找-r后面的路径参数下的所有子目录,把所有包含go.mod文件的子目录都添加到go work文件中。
如果某个Go Module的目录已经被加到go.work里了,后面该目录没有go.mod文件了或者该目录被删除了,那对该目录再次执行go work use命令,
该目录的use指令会从go.work文件里自动移除。(注意:自动移除要从Go 1.18正式版本才会生效,Go 1.18beta1版本有bug,自动删除不会生效)
go.work的语法
go.work的语法和go.mod类似,包含如下3个指令:
- go: go的版本,例如 go 1.18
- use: 添加一个本地磁盘上的Go Module到workspace的主Module集合里。use后面的参数是go.mod文件所在目录相对于workspace目录的相对路径,例如use ./main。
use指令不会添加指定目录的子目录下的Go Module到workspace的主Module集合里。
- replace: 和go.mod里的 replace指令类似。go.work里的 replace指令可以替换某个Go Module的特定版本或者所有版本的内容。
最后根据以下图进行