前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go workspaces使用指北

Go workspaces使用指北

作者头像
杜金房
发布于 2025-02-21 05:19:40
发布于 2025-02-21 05:19:40
14400
代码可运行
举报
运行总次数:0
代码可运行

在 Go 1.18 之前如果你需要开发中使用多个模块,你需要在每个模块的 go.mod 文件中手动管理依赖关系。Go 1.18 引入了工作区模式,允许你在同一个工作区中同时处理多个模块,而无需频繁修改每个模块的 go.mod 文件。这对于需要同时处理多个相关模块的开发者来说,是一个巨大的便利。

工作区概述

工作区模式通过一个 go.work 文件来管理多个模块的依赖关系。这个文件位于工作区的根目录下,包含了 usereplace 指令,用于指定要使用的模块和替换特定模块的版本。

主要特点

  • 统一管理依赖:通过 go.work 文件统一管理多个模块的依赖,无需修改每个模块的 go.mod 文件。
  • 灵活的工作流程:支持多种工作流程,如在上游模块中添加功能并在自己的模块中使用,或者在同一仓库中处理多个相互依赖的模块。
  • 简化依赖切换:可以通过注释掉 go.work 文件中的 use 指令来快速切换不同的依赖配置。

创建工作区

初始化工作区

在工作区的根目录下运行以下命令来初始化工作区:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go work init [模块目录1] [模块目录2]

如果不指定模块目录,会创建一个空的工作区。

添加模块到工作区

可以使用以下命令将模块添加到工作区:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go work use [模块目录]

或者手动编辑 go.work 文件添加 use 指令。

递归添加模块

如果工作区目录下有多个模块,可以使用以下命令递归添加所有包含 go.mod 文件的目录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go work use -r .

go.work 文件结构

go.work 文件的结构类似于 go.mod 文件,包含以下几个指令:

  • go: 指定 Go 工具链的版本,例如 go 1.18
  • use: 指定要使用的模块,参数是模块目录的相对路径。
  • replace: 替换特定模块的版本,类似于 go.mod 文件中的 replace 指令。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go 1.18

use (
    ./path-to-upstream-mod-dir
    ./path-to-your-module
)

replace (
    example.com/module v1.0.0 => ./local-module
)

常见工作流程

在上游模块中添加功能并使用在自己的模块中

  • 创建工作区目录。
  • 克隆上游模块并添加功能。
  • 初始化工作区:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go work init [上游模块路径]
  • 添加自己的模块到工作区:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go work use [自己的模块路径]
  • 编译、运行和测试自己的模块,使用上游模块的新功能。
  • 发布上游模块和自己的模块。

处理同一仓库中的多个相互依赖的模块

  • 创建工作区目录。
  • 克隆包含多个模块的仓库。
  • 初始化工作区并添加所有相关模块:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go work init [模块1路径] [模块2路径]
  • 在 go.work 文件中指定所有相关模块:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go 1.18

use (
    ./tools
    ./tools/groundhog
)
  • 在工作区中进行开发,本地更改会自动反映到所有相关模块中。

切换不同的依赖配置

你可以创建多个工作区目录,每个目录对应不同的 go.work 文件,或者在同一个 go.work 文件中通过注释掉不需要的 use 指令来切换依赖配置。

仍然使用 GOPATH?

如果你还在使用 GOPATH,工作区模式也可以帮助你。你可以在 GOPATH 的根目录下创建一个工作区:

  • 在 GOPATH 根目录下初始化工作区:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go work init
  • 使用 go work use 命令添加本地模块或特定版本的依赖。
  • 使用 go work replace 命令替换现有依赖。

工作区命令

Go 1.18 引入了以下命令来管理工作区:

  • go work init: 初始化工作区。
  • go work use: 添加模块到工作区。
  • go work sync: 将 go.work 文件中的依赖信息同步到每个模块的 go.mod 文件中。
  • go work edit: 通过命令行编辑 go.work 文件(主要用于工具和脚本)。

启用工作区模式

工作区模式通过 GOWORK 环境变量启用。如果 GOWORK 指向一个以 .work 结尾的文件,go 命令就会进入工作区模式。

你可以通过以下命令查看当前使用的 go.work 文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go env GOWORK

常用命令

在工作区模式下,以下命令会根据 go.work 文件中的配置自动处理依赖关系:

  • go list
  • go build
  • go test
  • go run
  • go vet

以 xcc 项目为例展示如何使用 workspaces

  • 在xcc根目录执行go work init
  • 编辑 go.work 文件。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 文件。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeSWITCH中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go 1.18 新特性多模块工作区教程-让多模块开发变得简单
Tutorial: Getting started with multi-module workspaces
link1st
2022/03/21
2.5K0
Go 1.18 新特性多模块工作区教程-让多模块开发变得简单
Go Modules知识点总结
起初Go语言在1.5之前没有依赖管理工具,若想引入依赖库,需要执行go get命令将代码拉取放入GOPATH/src目录下,作为GOPATH下的全局依赖,这也就意味着没有版本控制及隔离项目的包依赖;
Golang梦工厂
2023/02/26
8650
Go Modules知识点总结
史上最全的Go语言模块(Module)管理详解(基于Go1.19)
go语言一直到1.10,都是使用GOPATH设置模块搜索路径,但从1.11开始,引入了新的Go模块管理机制(go modules),不过一直到1.15,默认的模块管理方式仍然是GOPATH,直到Go1.16开始,将默认的模块管理方式改成了go modules,在这种工作模式下,每一个模块都必须使用go.mod文件指定模块的位置。
蒙娜丽宁
2022/11/22
3.1K0
史上最全的Go语言模块(Module)管理详解(基于Go1.19)
Go 包操作之如何拉取私有的Go Module
在前面,我们已经了解了GO 项目依赖包管理与Go Module常规操作,Go Module 构建模式已经成为了 Go 语言的依赖管理与构建的标准。
贾维斯Echo
2023/10/26
9890
Go 包操作之如何拉取私有的Go Module
Go 1.18 新增三大功能之一“工作区模式”介绍
Go 官方在 Go v1.11 新增 Go Modules 模式,并一直持续到 Go v1.16,每个版本的 Go Modules 模式都会有一些变化。但是,我们的项目使用 Go Modules 模式时,仍然会遇到一些问题。
frank.
2022/12/27
1K0
Go workspace的使用
Go Workspace[1]和泛型,模糊测试一样, 也是Go语言在1.18版本中引入的一个新特性,目的是为了解决在开发涉及多个模块(module)的Go项目时的依赖管理问题。
fliter
2024/02/27
3550
Go workspace的使用
Go 1.18 新特性 - 工作区
这时候,如果我们运行 go mod tidy,肯定会报错,因为我们的 mypkg 包根本没有提交到 github 上,肯定找不到。
后端云
2022/06/09
5210
Go 1.18 新特性 - 工作区
解读Go语言的2021:稳定为王
一方面,越来越多的计算需求被转移到了云端(即云计算端)。若是相关从业者,应该已经对“把程序部署到云端”习以为常了;另一方面,一些终端变得越来越智能化了。有的厂商,甚至把神经网络引擎(一种用于执行机器学习和人工智能任务的处理单元)内置在了手机当中。
深度学习与Python
2022/03/01
4530
解读Go语言的2021:稳定为王
Go 1.18 workspace 使用初体验
Go 1.18 终于正式发布了,本次版本更新中 Go mod 有个很实用的功能 “multi-module workspaces”. 本篇文章简单介绍下 workspace 的使用方式以及使用场景。
haohongfan
2022/04/01
7.2K0
2022年4月5日 Go生态洞察:Go 1.18的工作空间模式深入解析
🐾 大家好,我是猫头虎博主,今天我们来深入探索Go 1.18新加入的一项闪亮特性——工作空间模式。这个功能让我们能同时处理多个模块,而不必为每个模块编辑go.mod文件。如果你对Go生态感兴趣,那就跟我一起深入了解这个话题吧!🌟
猫头虎
2024/04/08
1190
2022年4月5日 Go生态洞察:Go 1.18的工作空间模式深入解析
Go 1.18 相比 Go 1.17 有哪些值得注意的改动?
Some Undocumented Changes in Go 1.18 and 1.19
Piper破壳
2025/04/28
500
Go 1.18 版本新特性详解
Go官方在今年 315 悄悄发布了Golang 1.18 版本。Go 1.18 是一个大型版本,其中包括新功能、性能改进以及我们对该语言的最大更改。最重要的3个特性如下:
Johns
2022/07/08
5.7K2
Go 1.18 版本新特性详解!
导语 | 本文推选自腾讯云开发者社区-【技思广益 · 腾讯技术人原创集】专栏。该专栏是腾讯云开发者社区为腾讯技术人与广泛开发者打造的分享交流窗口。栏目邀约腾讯技术人分享原创的技术积淀,与广泛开发者互启迪共成长。本文作者是腾讯后台开发工程师Johns。 本文主要探析Go 1.18版本新特性,希望本文能对此方面感兴趣的开发者们提供一些经验和帮助。 Go官方在今年315悄悄发布了Golang 1.18版本。Go 1.18是一个大型版本,其中包括新功能、性能改进以及我们对该语言的最大更改。最重要的3个特性如下: 泛
腾讯云开发者
2022/09/02
9470
Go 1.18 版本新特性详解!
go老项目迁移module遇到坑总结
注意: 这里记得版本要是v1.2.3格式的,一开始忘记v直接写版本号1.3.6导致错误。
solate
2022/06/08
4.4K0
go老项目迁移module遇到坑总结
代码包是Go语言的灵魂:深入了解Go语言的代码组织方式和最佳实践
Go语言是一种简洁、高效、可靠的编程语言,它支持并发、垃圾回收、模块化等特性,适用于各种场景和领域。Go语言的源码是以代码包为基本组织单位的,一个代码包可以包含多个源码文件,每个源码文件都必须在文件头部声明自己所属的包名。代码包可以被其他代码包导入和使用,实现代码的复用和模块化。
运维开发王义杰
2023/08/10
6030
代码包是Go语言的灵魂:深入了解Go语言的代码组织方式和最佳实践
Go的包管理学习笔记
大部分语言都有版本管理工具,比如nodejs的npm,python中的pip,java里的maven,但是go语言的版本管理经历了漫长的演进历程:
Johns
2021/08/11
1.2K0
Go 开发常用操作技巧--模块管理
Go 依赖管理经历了 3 个阶段,GOPATH、Go Vendor、Go Module。
微客鸟窝
2023/01/09
5770
Go 开发常用操作技巧--模块管理
Go 1.18.1 Beta 尝鲜
昨天,go 终于发布了 1.18 的 beta 版本, 带来了大家期待已久的泛型,抓紧时间康康能不能赶上热乎的。
JuneBao
2022/10/26
8880
Go语言中全新特性:Go.work文件的引入和使用
在近期的Go开发过程中,你是否遇到了一个名为"go.work"的新文件?这是Go语言的一项全新特性,今天我们就来详细探讨一下这个新的特性,让我们的Go开发变得更加高效和便捷。
运维开发王义杰
2023/08/10
3.5K0
Go语言中全新特性:Go.work文件的引入和使用
项目改用GoModules管理依赖的方法和经验总结
Go语言官方提供的依赖包管理工具已经发布很久了,有很多大佬的文章对Go Modules做了非常详尽的介绍,比如煎鱼大佬的: Go Modules终极入门(文章链接:https://juejin.cn/post/6844903433846145038)。
KevinYan
2020/12/15
1K0
项目改用GoModules管理依赖的方法和经验总结
相关推荐
Go 1.18 新特性多模块工作区教程-让多模块开发变得简单
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档