概述
背景
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
全局变量 GOWORK
为 off
则可以禁用工作区功能 export GOWORK=off
。
总结
go
在 1.18
新推出的 multi-module workspaces
模式,主要就是解决本地开发依赖问题,用于解决平常开发时的痛点问题:
- 依赖本地
replace module
。 - 依赖本地未发布的
module
。
- 设置了工作区后,所有的配置都会以工作区的配置为最高优先级。
go.work
文件不需要上传到git
仓库,本地使用即可。go.work
文件使用绝对路径,不生效时,需要在引用模块上加上引号:use("C:/workspace/test")
。
参考
- go 官网介绍
- Go1.18 新特性:多 Module 工作区模式
最后
以上就是怕孤独天空为你收集整理的go module 的本地仓库依赖解决方案(Multi-Module Workspaces)多 module 工作区模式 简介背景使用go.work 命令总结参考的全部内容,希望文章能够帮你解决go module 的本地仓库依赖解决方案(Multi-Module Workspaces)多 module 工作区模式 简介背景使用go.work 命令总结参考所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复