背景
不知道你们是否有类似情况?
问题: 在开发项目中(通常情况会同时修改项目代码:A、B ),A项目go mod依赖B, B可能一直处于变更中,但B的代码不想每次变更都推送到远端,如何让A能正常依赖B的变更呢?
正常情况: B变更后, 推送到远端仓库, A通过拉取B新的gomod,就能获取B的变更代码依赖。
go get domain/repo/B@[branch or tag name]
通过上面的命令, A可以获取到了B变更后的代码,这个库的代码依赖在目录:$GOPATH/pkg/mod中
但这样有个问题?
每次B做了很小的变动,都得推到远端,然后A还得重新拉B最新的代码, 是不是有点烦?
go work
没错, 这里可以使用go work 来解决这个问题
通过 go work 可以将对代码库B的依赖变成你自己本地的库依赖, 这样B的所有改动都能在A那边实时获取到。 这样就不至于在写A项目代码时,依赖关于B的代码定义报错的情况
go work 命令:
常用command:
- init: 初始化go work
- edit: 修改go.work 文件
- sync: TODO
- use: 添加一个module
通常在 $GOPATH/src下执行以下命令来初始化 一个workspace
go work init
结果: 在当前目录生成一个 go.work文件
注意: 在执行 go work init 时, 如果父目录存在一个go.work文件, 在子目录再次执行时,会下面的报错
go: $GOPTTH/src/go.work already exists
如果想添加一个module依赖到该workspace,可以进行如下操作:
方法一:
进入所有module的目录下执行: go work use .
方法二:
直接在go.work文件所在目录下, 执行 : go work use [module_path]
module_path: 表示module相对于当前目录的全路径地址
在通过上面两种方法引入过module之后的go.work 文件类似如下:
go 1.20
use (
../foo/bar
./baz
)
针对上面的问题, 在init之后,通过执行以下命令, A就可以直接引用本地B项目的代码
go work use ./domain/repo/B
END ~