在 Go 1.18 之前如果你需要开发中使用多个模块,你需要在每个模块的 go.mod 文件中手动管理依赖关系。Go 1.18 引入了工作区模式,允许你在同一个工作区中同时处理多个模块,而无需频繁修改每个模块的 go.mod 文件。这对于需要同时处理多个相关模块的开发者来说,是一个巨大的便利。
工作区概述
工作区模式通过一个 go.work
文件来管理多个模块的依赖关系。这个文件位于工作区的根目录下,包含了 use
和 replace
指令,用于指定要使用的模块和替换特定模块的版本。
主要特点
go.work
文件统一管理多个模块的依赖,无需修改每个模块的 go.mod
文件。go.work
文件中的 use
指令来快速切换不同的依赖配置。创建工作区
在工作区的根目录下运行以下命令来初始化工作区:
go work init [模块目录1] [模块目录2]
如果不指定模块目录,会创建一个空的工作区。
添加模块到工作区
可以使用以下命令将模块添加到工作区:
go work use [模块目录]
或者手动编辑 go.work
文件添加 use
指令。
递归添加模块
如果工作区目录下有多个模块,可以使用以下命令递归添加所有包含 go.mod 文件的目录:
go work use -r .
go.work 文件结构
go.work
文件的结构类似于 go.mod
文件,包含以下几个指令:
go 1.18
。go.mod
文件中的 replace
指令。示例:
go 1.18
use (
./path-to-upstream-mod-dir
./path-to-your-module
)
replace (
example.com/module v1.0.0 => ./local-module
)
常见工作流程
在上游模块中添加功能并使用在自己的模块中
go work init [上游模块路径]
go work use [自己的模块路径]
处理同一仓库中的多个相互依赖的模块
go work init [模块1路径] [模块2路径]
go 1.18
use (
./tools
./tools/groundhog
)
切换不同的依赖配置
你可以创建多个工作区目录,每个目录对应不同的 go.work 文件,或者在同一个 go.work 文件中通过注释掉不需要的 use 指令来切换依赖配置。
仍然使用 GOPATH?
如果你还在使用 GOPATH,工作区模式也可以帮助你。你可以在 GOPATH 的根目录下创建一个工作区:
go work init
Go 1.18 引入了以下命令来管理工作区:
go.work
文件中的依赖信息同步到每个模块的 go.mod
文件中。go.work
文件(主要用于工具和脚本)。工作区模式通过 GOWORK
环境变量启用。如果 GOWORK
指向一个以 .work
结尾的文件,go 命令就会进入工作区模式。
你可以通过以下命令查看当前使用的 go.work
文件:
go env GOWORK
在工作区模式下,以下命令会根据 go.work
文件中的配置自动处理依赖关系:
go work init
go.work
文件。go 1.20
use (
./srv/uas
./core
./stack
./srv/sys
./srv/acd
./srv/byd
./srv/xcc
./srv/xuc
./srv/uc
./srv/ebl
./srv/finance
./srv/cdr
./srv/xdialer
./srv/logger
./srv/record
./srv/bydr
./srv/update
./srv/sharding
./cli/syncer
./stack/cmd/protoc-gen-stack
)
replace (
github.com/coreos/bbolt => go.etcd.io/bbolt v1.3.4
)
这样xcc的工作区就创建好了。那么工作区有什么好处呢?首先go的 语言服务器(language server) gopls 和 vscode 的go extension, 会识别工作区,并自动识别依赖关系,从而提供更好的代码提示、跳转等功能。
比如 uas 服务需要引用本地的 core 模块,之前需要写 replace xswitch.cn/core => ../../core。在使用了 workspaces 之后,可以直接在项目中使用 xswitch.cn/core。工作区会根据 go.work 文件自动处理依赖关系,所以不需要再手动修改 go.mod 文件。
本文分享自 FreeSWITCH中文社区 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!