go module 的本地仓库依赖解决方案(Multi-Module Workspaces)多 module 工作区模式 简介

背景

go 中的项目引用库一般都是放在 git 仓库中的,go.mod 中通过 require 来进行引用:

require github.com/common

但是当同一个项目由多个项目开发人员共同开发(如:统一的 common 仓库存放一些常用的函数)而且这个仓库经常会进行改动,这时使用这种引用远端的仓库方式就不适合了。

module 可以使用本地依赖,在 go.mod 文件中使用 replace 来做替换,如下:

replace github.com/common => ../common

这样就可以直接修改本地代码进行调试,但是这也存在问题:并不能保证所有人的本地环境都一样,如果不小心将修改提交到 git 仓库,就会影响其他人,如果能统一项目的结构,那使用 replace 也是没有什么问题的,在 go1.18 之前就是这么做的,也不是不能接受。

但是 go1.18 后,遇到这类问题,我们可以有更好的使用 mod 的方法了,go 团队提供了一个新特性 Multi-Module Workspaces,多 module 工作区模式。

使用

其原理和 replace 相似,也是通过依赖本地环境模块来修改 mod 的指向。

1. 创建并初始化工作区

$ mkdir workspace #创建工作区目录
$ cd workspace
$ go work init #初始化work工作区

至此,我们可以看到工作区中生成了 go.work 文件,文件中只有一行内容:

go 1.18

2. 创建 go 模块

如果已有 go 模块,可以直接跳过此步。

$ mkdir wd #在刚刚创建的 workspace 目录下创建新的目录
$ cd wd
$ go mod init wd 
$ vim wd.go # 新建 wd.go 文件

wd.go 内容如下:

package wd

const Version = "1.0"

这里只给声明一个 Version 常量用于演示。

$ cd .. && mkdir test #在刚刚创建的 workspace 目录下创建新的目录
$ cd test
$ go mod init test 
$ vim main.go # 新建 main.go 文件

main.go 内容如下:

package main

import "wd"

func main() {
	println(wd.Version)
}

引用之前的 wd 模块,并输出其 Version 值。

3. 向工作区中添加模块

执行完上述步骤后,当前的目录结构为:

- workspace
	- test
		- go.mod
		- main.go
	- wd
		- go.mod
		- wd.go
	- go.work

工作区中添加模块,可以指向相对路径或绝对路径。在 workspace 工作区目录下执行:

$ go work use ./test ./wd

执行完后,go.work 文件内容变更如下:

go 1.18

use (
	./test
	./workMod
)

注意:windows 使用绝对路径的时候,go.work 文件中 use 需要带上 “引号”

go 1.18
use (
	"C:/workspace/test"
	./wd
)

4. 测试

workspace 工作区目录下执行 go run ./test,可以看到能够输出 wd 模块的 Version

1.0

go.work 命令

支持三个指令:

  • go: 声明 go 版本号,主要用于后续新语义的版本控制。
  • use: 声明应用所依赖模块的具体文件路径,路径可以是绝对路径或相对路径。
  • replace: 声明替换某个模块依赖的导入路径,优先级高级 go.mod 中的 replace 指令。

若要禁用工作区,可以设置 Go 全局变量 GOWORKoff 则可以禁用工作区功能 export GOWORK=off

总结

go1.18 新推出的 multi-module workspaces 模式,主要就是解决本地开发依赖问题,用于解决平常开发时的痛点问题:

  1. 依赖本地 replace module
  2. 依赖本地未发布的 module
  • 设置了工作区后,所有的配置都会以工作区的配置为最高优先级。
  • go.work 文件不需要上传到 git 仓库,本地使用即可。
  • go.work 文件使用绝对路径,不生效时,需要在引用模块上加上引号:use("C:/workspace/test")

参考

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值