Go 1.18 的工作区模式

2022年4月11日 312点热度 0人点赞 0条评论

当一个项目越来越复杂的时候,一定会拆分为多个模块,以便进行代码复用和更好的多人协作开发。


假设我们已经有了两个模块 flysnow.org/util 和flysnow.org/product ,模块flysnow.org/product依赖 flysnow.org/util 


现在有一个需求,需要同时修改这两个模块,以便让flysnow.org/util新增的方法给模块flysnow.org/product使用。


但是当同事A在模块flysnow.org/util中增加新的方法后,要么推送到VCS中,让负责模块flysnow.org/product的同事B使用,这是发布的场景。


如果模块flysnow.org/util没有发布呢?那么就只能通过go.mod中的replace指令进行替换,把对模块flysnow.org/util的引用,换成本地的未发布的版本,比如:

replace flysnow.org/util => /Users/flysnow/go/demo/util


相信我们都遇到过以上两种情形,这两种情形都有相应的弊端,比如:

  1. 把没有调试、没有测试的代码发布了,会影响其他正常构建

  2. replace的时候,忘记改回来,提交到VCS中了,影响了其他人使用

为了解决以上问题,Go 团队提出了工作区的概念,并且在Go 1.18 中发布。

Go 工作区,是你的工作区,它和多人协作、VCS等无关。说白了它就是个本地目录,通过go.work文件来管理多个go.mod模块。

要创建一个Go 工作区非常简单,通过如下命令即可:

mkdir workspacecd workspacego work init /Users/flysnow/go/demo/util /Users/flysnow/go/demo/product

在以上示例中,workspace是我创建的一个工作区,可以在你的电脑的任何地方,名字也可以自取。


然后go work init 后是两个go.mod的绝对路径,用空格分开,当然你也可以用相对路径。


运行以上代码后,就会在workspace目录下生成一个go.work文件,它的内容如下:

go 1.18
use ( /Users/flysnow/go/demo/product /Users/flysnow/go/demo/util)

use是go.work文件的一个指令,用于管理包含的go.mod模块。

除了use指令,go.work还有replace指令,它和go.mod的replace很像,它用于把Go 工作区间管理的go.mod全部替换为指定的路径,并且它的优先级要比go.mod的replace要高。

现在,我们用到的这两个模块都在同一个工作区了,那么就不需要再修改模块flysnow.org/product的go.mod replace 指令完成本地的依赖了。

这时候,在工作区 workspce目录下,运行如下命令,即可进行验证。

➜  workspace go run flysnow.org/product你好

因为都在一个工作区,go可以帮你找到模块flysnow.org/product所依赖的flysnow.org/util模块。


如果你只是切换到product目录下运行以上命令,只会提示你:

➜  product go run main.go main.go:3:8: no required module provides package flysnow.org/util; to add it:  go get flysnow.org/util

不止我上面这种依赖上游模块的例子可以使用Go工作区,如果你一个代码库中有多个模块也是可以用的,只需要把他们都加入到Go 工作区即可。

go work命令有一个use可以把本地目录的模块加入工作区,如下所示:

go work use [path-to-your-module]

方括号中的路径,可以换成你自己电脑上的本地模块路径。


当然你也可以直接修改go.work文件,效果是一样的,这里不再举例,你可以自己试试。


go.work本质上是一种本地化的解决办法,因为go.mod都是放在VCS中的,和项目息息相关,所以我们很少去修改它来达到一些Hack的操作。


现在有了go.work就好办多了,因为它就是一个本地的东西,不在VCS中,想怎么改就怎么改,又不会动到所管理模块的go.mod,所以就不会影响其他协作的开发人员,非常安全。


推荐阅读:
如何开源自己的 Go 库

资料下载

点击下方卡片关注公众号,发送特定关键字获取对应精品资料!

  • 回复「电子书」,获取入门、进阶 Go 语言必看书籍。

  • 回复「视频」,获取价值 5000 大洋的视频资料,内含实战项目(不外传)!

  • 回复「路线」,获取最新版 Go 知识图谱及学习、成长路线图。

  • 回复「面试题」,获取四哥精编的 Go 语言面试题,含解析。

  • 回复「后台」,获取后台开发必看 10 本书籍。

对了,看完文章,记得点击下方的卡片。关注我哦~ ???

如果您的朋友也在学习 Go 语言,相信这篇文章对 TA 有帮助,欢迎转发分享给 TA,非常感谢!图片

73980Go 1.18 的工作区模式

这个人很懒,什么都没留下

文章评论