文章目录

  • 背景
    • 举例:未发布的 module
  • Go1.18 新特性:多模块(Multi-Module)工作区模式
    • Go1.18 工作区模式
      • 初始化一个新的工作区
        • go work use 添加新的模块到工作区
        • go work edit 用于编辑 go.work 文件
        • go work sync 将工作区的构建列表同步到工作区的模块
        • go env GOWORK
    • go.work 文件结构
    • go.work 文件优先级高于 go.mod 中定义在
    • 如何禁用工作区

背景

在 go 中使用多个模块可能真的是一件苦差事。特别是当您的一个模块依赖于另一个模块时,您需要同时编辑这两个模块!

您编辑父模块,但是然后您需要将其推送到repo。然后在依赖模块中运行 update 以下载新版本。最终使用2行修复您需要的。至少可以说是一种痛苦。

在 Go 1.18之前,建议使用依赖模块中的 replace 指令来处理这个问题。

这个方法是有效的,但也有自己的问题,比如需要手动编辑 go.mod,确保你提交代码时候,不commit 这个 replace等等。

最后,从 Go 1.18开始,引入了一种同时处理多个模块的新方法,这种方法消除了这些问题: go.work。

Multi-Module, Single Workspace
https://medium.com/@michael_epps/multi-module-single-workspace-3493528555ad

举例:未发布的 module

在做本地的 Go 项目开发时,可能会在本地同时开发多个库(项目库、工具库、第三方库)等。

如下代码:

package mainimport ("github.com/eddycjy/pkgutil"
)func main() {pkgutil.PrintFish()
}

我们看到:该代码对外唯一的依赖是module path为"github.com/eddycjy/pkgutil"的module,但后者是一个尚在本地进行开发,还未发布到http://github.com上的module。

如果这个时候运行 go run 或是 go mod tidy,都不行,会运行失败。
报如下类似错误:

fatal: repository 'https://github.com/eddycjy/pkgutil/' not found

这个问题报错是因为 github.com/eddycjy/pkgutil 这个库,在 GitHub 是没有的,自然也就拉取不到。

因此,许多同学会发出灵魂质疑:Go 的依赖都必须要上传到 GitHub 吗,强绑定?

解决方法:在 Go1.18 以前,我们会通过 replace,又或是直接上传到 Github 上,自然也就能被 Go 工具链拉取到依赖了。

用replace指示符将该版本指向本地的module的开发目录。

Go1.18 新特性:多模块(Multi-Module)工作区模式

2022 年 3 月 15 日 go 1.18 正式发布,新版本除了对性能的提升之外,还引入了很多新功能,其中就有 go 期盼已久的功能泛型(Generics),同时还引入的多模块工作区(Workspaces)和模糊测试(Fuzzing)。

弥补了当前go module构建模式的一些不足,堪称是go module构建模式的最后一块拼图。

Go 多模块工作区能够使开发者能够更容易地同时处理多个模块的工作,如:

  • 方便进行依赖的代码调试(打断点、修改代码)、排查依赖代码 bug
  • 方便同时进行多个仓库/模块并行开发调试

go 使用的是多模块工作区,可以让开发者更容易同时处理多个模块的开发。在 Go 1.17 之前,只能使用 go.mod replace 指令来实现,如果你正巧是同时进行多个模块的开发,使用它可能是很痛苦的。每次当你想要提交代码的时候,都不得不删除掉 go.mod 中的 replace 才能使模块稳定的发布版本。

Go1.18 工作区模式

在社区的多轮反馈下,Michael Matloob 提出了提案《Proposal: Multi-Module Workspaces in cmd/go[1]》进行了大量的讨论和实施,在 Go1.18 正式落地。

新提案的一个核心概念,就是增加了 go work 工作区的概念,针对的是 Go Module 的依赖管理模式。

这个提案引入一个go.work文件用于开启Go工作区模式。go.work通过directory指示符设置一些本地路径,这些路径下的go module构成一个工作区(workspace),Go命令可以操作这些路径下的go module,也会优先使用工作区中的go module

其能够在本地项目的 go.work 文件中,通过设置一系列依赖的模块本地路径,再将路径下的模块组成一个当前 Go 工程的工作区,也就是 N 个 Go Module 组成 1 个 Go Work, 工作区的读取优先级是最高的。

总结: 当你的本地有很多module,且这些module存在相互依赖,那么我们可以在这些module的外面建立一个Go工作区,基于这个Go工作区开发与调试这些module就变得十分方便。

初始化一个新的工作区

只要执行 go work init 就可以初始化一个新的工作区,后面跟的参数就是要生成的具体子模块 mod。

命令如下:

go work init ./mod ./tools

项目目录如下:

awesomeProject
├── mod
│   ├── go.mod      // 子模块
│   └── main.go
├── go.work         // 工作区
└── tools├── fish.go└── go.mod      // 子模块

go work 支持命令

  • 通常情况下,建议不要提交 go.work 文件到 git 上,因为它主要用于本地代码开发。

  • 推荐在: $GOPATH 路径下执行,生成 go.work 文件

  • go work init 初始化工作区文件,用于生成 go.work 工作区文件

初始化并写入一个新的 go.work 到当前路径下,可以指定需要添加的代码模块
示例: go work init ./hello 将本地仓库 hello 添加到工作区
hello 仓库必须是 go mod 依赖管理的仓库(./hello/go.mod 文件必须存在)

go work use 添加新的模块到工作区

use 指定使用的模块目录

命令示例:

go work use ./example 添加一个模块到工作区

命令示例:

go work use ./example 添加一个模块到工作区
go work use ./example ./example1 添加多个模块到工作区
go work use -r ./example 递归 ./example 目录到当前工作区
删除命令使用 go work edit -dropuse=./example 功能

可以使用 go work use hello 添加模块,也可以手动修改 go.work 工作区添加新的模块
在工作区中添加了模块路径,编译的时候会自动使用 use 中的本地代码进行代码编译,和 replaces 功能类似。

# 单模块结构
use ./hello# 多模块结构
use (./hello./example
)

go work edit 用于编辑 go.work 文件

go work edit 用于编辑 go.work 文件
可以使用 edit 命令编辑和手动编辑 go.work 文件效果是相同的
示例:

go work edit -fmt go.work 重新格式化 go.work 文件
go work edit -replace=github.com/link1st/example=./example go.work 替换代码模块
go work edit -dropreplace=github.com/link1st/example 删除替换代码模块
go work edit -use=./example go.work 添加新的模块到工作区
go work edit -dropuse=./example go.work 从工作区中删除模块

go work sync 将工作区的构建列表同步到工作区的模块

go env GOWORK

查看环境变量,查看当前工作区文件路径
可以排查工作区文件是否设置正确,go.work 路径找不到可以使用 GOWORK 指定

go.work 文件结构

文件结构和 go.mod 文件结构类似,支持 Go 版本号、指定工作区和需要替换的仓库
文件结构示例:

go 1.18use (./hello./example
)replace (github.com/link1st/example => ./example1
)

replaces 替换依赖仓库地址
replaces 命令与 go.mod 指令相同,用于替换项目中依赖的仓库地址
需要注意的是 replaces 和 use 不能同时指定相同的本地路径

错误示例
同时在 use 和 replace 指定相同的本地路径

go 1.18use (./hello./example
)replace (github.com/link1st/example => ./example
)

go.work 文件优先级高于 go.mod 中定义在

同时使用 go.work 和 go.mod replace 功能的的时候分别指定不同的代码仓库路径,go.work 优先级高于 go.mod 中定义

如何禁用工作区

Go 全局变量 GOWORK 设置 off 则可以禁用工作区功能

export GOWORK=off

Go1.18 新特性:多模块(Multi-Module)工作区模式相关推荐

  1. Go1.18 新特性:多 Module 工作区模式

    Go 的依赖管理,也就是 Go Module.从推出到现在,也已经有了一定的年头了,吐槽一直很多,官方也不断地在进行完善. Go1.18 将会推出一个新特性:Multi-Module Workspac ...

  2. Go1.18 新特性:高效复制,strings, bytes 库新增 Clone 功能

    大家好,期盼已久的 Go1.18 上周已经发布,今天给大家带来一个 1.18 版本新特性中的优化相关的内容,是与 strings 和 bytes 标准库有关. 背景 想要更快捷复制 在日常编程中,字节 ...

  3. Go1.18 新特性:引入新的 netip 网络库

    大家好,我是煎鱼. 写这篇文章时是大年初一,原本想说这个月就要发布 Go1.18 了.但是,好家伙,Go1.18 beta2 发布了,官方告知社区 Go1.18 要拖更到 3 月份了,咕咕咕... 如 ...

  4. go每日新闻(2021-12-01)——Go 1.18新特性前瞻:原生支持Fuzzing测试

    每日一谚: Go's package system teach us to prioritize the consumer of our code. go中文网每日资讯–2021-12-01 一.Go ...

  5. go每日新闻(2021-02-02)——Go1.16 新特性:一文快速上手 Go embed

    每日一谚:The Go analogue: goroutines connected by channels just like unix pipes style. go中文网每日资讯–2021-02 ...

  6. React 18 新特性(三):渐变更新

    文章目录 前言 一.startTransition:渐变更新 举个例子 模拟代码实现这个例子 启用渐变更新 二.useDeferredValue:返回一个延迟响应的值 三.useTransition ...

  7. 你必须了解的 React 18 新特性

    你必须了解的 React 18 新特性 你必须了解的 React 18 新特性 1. React 18是什么? 2. 升级到 React 18 3. React 17 的问题 4. React 18 ...

  8. Go1.17新特性 ,给我们带来了10%的性能提升

    在 Go1.17 发布后,我们惊喜的发现 Go 语言他又又又优化了,编译器改进后产生了约 5% 的性能提升,也没有什么破坏性修改,保证了向前兼容. img 他做了些什么呢,好像没怎么看到有人提起.为此 ...

  9. Go1.16 新特性:一文快速上手 Go embed

    大家好,我是正在沉迷学习煎鱼的煎鱼. 在以前,很多从其他语言转过来 Go 语言的同学会问到,或是踩到一个坑.就是以为 Go 语言所打包的二进制文件中会包含配置文件的联同编译和打包. 结果往往一把二进制 ...

最新文章

  1. 如何从一个表中选择另一个表中不存在的所有记录?
  2. android服务的启动过程,Android Service的启动过程(上)
  3. NLP系列学习:前向算法和后向算法
  4. pre textarea code标签区别
  5. windows IDA 调试SO
  6. 8、第六 -面向对象高级语法-异常处理
  7. python字符串反向输出_Python反向字符串– 5种方法和最佳方法
  8. Paip.YXSHOP易想商场功能模块说明
  9. python下载电影天堂_Python爬虫之《电影天堂》电影详情+下载地址爬取
  10. xp系统能安装32位的python吗-32位XP系统 Python3.4.4安装scrapy1.6.0
  11. 追求得到之日即其终止之时, 寻觅的过程亦即失去的过程。——村上
  12. 我有一壶酒,足以慰风尘
  13. 组合式升降压PFC的分析方法
  14. 自己照片怎么做成漫画头像?照片变漫画效果方法分享
  15. 种子是down.php,[原创作品][PHP]BT种子打包推送小神器~~
  16. 直播平台开发中解决iOS 14 兼容问题和静默推送
  17. 持续交付的发展与持续交付中的测试
  18. python 双重差分_双重差分的理论与实践
  19. QQ旋风踏上“迷你快车”山寨路
  20. 八字精批付费测算系统源码/测桃花运网站系统源码/完美对接支付结算

热门文章

  1. 信息管理与信息系统专业
  2. 一种仪控系统黑盒测试系统ETest
  3. RS232串口测试工装研究
  4. 关于 Office 2013 在扩展屏幕模糊的问题
  5. Windows和Ubuntu使用Synergy共用一套键鼠
  6. C语言里获取数组长度
  7. FreeCAD 使用PartDesign创建一个简单的零件
  8. 王国维的人生三重境界(图)
  9. 河北专接本微机原理知识点04
  10. 摘要算法和加密算法区别