GO语言 | go work 神一般的管理 多个module没烦恼

11 篇文章 0 订阅
订阅专栏

前言

最近手上有个活,需要自己本地包之间进行依赖

具体描述如下:

设计了如下目录结构,其中关注postman部分,要求核心程序放在internal文件目录,cmd目录存放一个cmd版本的main,wasm目录存放一个wasm版本的main,但cmd和wasm的main都依赖于internal目录下的程序实现。
在这里插入图片描述
有了目标,原理上很简单,找到办法实现cmd可以导入internal包的方法就可以了

但是,就这么一个听起来很简单的目标,用过Go的都知道,虽然mod实现了Go的存放位置自由,但并没有解决全部问题,上述简单的梦想实现起来又得是各种左右摇摆的一通操作

在经过了艰苦卓绝的寻找之后

https://cloud.tencent.com/developer/article/1998266

https://zhuanlan.zhihu.com/p/109828249

这两篇文章详细介绍了如何跨文件目录进行本地包的操作,但是无奈本人抄都能抄错,就是没有办法完美实现两个目录包的调用,实现不了我理想中的状态,并且整个过程可以说是罗里吧嗦,这不科学

无意间发现了go在1.18版本更新了一个超级重磅的功能,那就是work!
在这里插入图片描述

看完了官方的描述,我确信,这就是我要找的人,国际惯例,还是原文地址先贴一下,外文好的,可直接一手理解

https://go.dev/doc/tutorial/workspaces

go work工作区模式

Go 1.18引入的工作区模式,可以让你不用修改每个Go Module的go.mod,就能同时跨多个Go Module进行开发

工作区里的每个Go Module在解析依赖的时候都被当做根Module。

在Go 1.18以前,如果遇到以下场景:Module A新增了一个feature,Module B需要使用Module A的这个新feature,你有2种方案:

  • 发布Module A的修改到代码仓库,Module B更新依赖的Module A的版本即可
  • 修改Module B的go.mod,使用replace指令把对Module A的依赖指向你本地未发布的Module A所在目录。等Module A发布后,在发布Module B的时候,再删除Module B的go.mod文件里的replace指令。

有了Go工作区模式之后,针对上述场景,我们有了更为简单的方案:你可以在工作区目录维护一个go.work文件来管理你的所有依赖。go.work里的use和replace指令会覆盖工作区目录下的每个Go Module的go.mod文件,因此没有必要去修改Go Module的go.mod文件了。

go work用法介绍

go work init

使用go work init来创建一个workspace,go work init 的语法如下所示:

go work init [moddirs]

moddirs是Go Module所在的本地目录。如果有多个Go Module,就用空格分开。如果go work init后面没有参数,会创建一个空的workspace。

执行go work init后会生成一个go.work文件,go.work里列出了该workspace需要用到的Go Module所在的目录,workspace目录不需要包含你当前正在开发的Go Module代码。

go work use

如果要给workspace新增Go Module,可以使用如下命令:

go work use [-r] moddir

或者手动编辑go work文件。

如果带有-r参数,会递归查找-r后面的路径参数下的所有子目录,把所有包含go.mod文件的子目录都添加到go work文件中。

如果某个Go Module的目录已经被加到go.work里了,后面该目录没有go.mod文件了或者该目录被删除了,那对该目录再次执行go work use命令,该目录的use指令会从go.work文件里自动移除。(注意:自动移除要从Go 1.18正式版本才会生效,Go 1.18beta1版本有bug,自动删除不会生效)

go.work

go.work的语法和go.mod类似,包含如下3个指令:

  • go: go的版本,例如 go 1.18
  • use: 添加一个本地磁盘上的Go Module到workspace的主Module集合里。use后面的参数是go.mod文件所在目录相对于workspace目录的相对路径,例如use ./main。use指令不会添加指定目录的子目录下的Go Module到workspace的主Module集合里。
  • replace: 和go.mod里的 replace指令类似。go.work里的 replace指令可以替换某个Go Module的特定版本或者所有版本的内容。

使用场景和最佳实践

Workspace使用起来很灵活,接下来会介绍最常见的几种使用场景及其最佳实践。

使用场景1

给上游模块新增feature,然后在你的Module里使用这个新feature

为你的workspace(工作区)创建一个目录。Clone一份你要修改的上游模块的代码到本地。本地修改上游模块的代码,增加新的feature。
在workspace目录运行命令go work init [path-to-upstream-mod-dir]。为了使用上游模块的新feature,修改你自己的Go Module代码。
在workspace目录运行命令 go work use [path-to-your-module] 。go work use 命令会添加你的Go Module的路径到 go.work 文件里:

go 1.18

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

运行和测试你的Go Module。发布上游模块的新feature。发布你自己的Go Module代码。

使用场景2:同一个代码仓库里有多个互相依赖的Go Module

当我们在同一个代码仓库里开发多个互相依赖的Go Module时,我们可以使用go.work,而不是在go.mod里使用replace指令。

为你的workspace(工作区)创建一个目录。

Clone仓库里的代码到你本地。代码存放的位置不一定要放在工作区目录下,因为你可以在go.work里使用use指令来指定Module的相对路径。在工作区目录运行 go work init [path-to-module-one] [path-to-module-two] 命令。

示例: 你正在开发 example.com/x/tools/groundhog 这个Module,该Module依赖 example.com/x/tools 下的其它Module。你Clone仓库里的代码到你本地,然后在工作区目录运行命令 go work init tools tools/groundhog
go.work 文件里的内容如下所示:

go 1.18

use (
./tools
./tools/groundhog
)

tools路径下其它Module的本地代码修改都会被 tools/groundhog 直接使用到。

使用场景3:切换依赖配置

如果要测试你开发的代码在不同的本地依赖配置下的场景,你有2种选择:

创建多个workspace,每个workspace使用各自的go.work文件,每个go.work里指定一个版本的路径。

创建一个workspace,在go.work里注释掉你不想要的use指令。

对于创建多个workspace的方案:

为每个workspace创建独立的目录。比如你开发的代码依赖了example.com/util这个Go Module,但是想测试example.com/util2个版本的区别,你可以创建2个workspace目录。
在各自的workspace目录运行 go work init 来初始化workspace。在各自的workspace目录运行 go work use [path-to-dependency]来添加依赖的Go Module特定版本的目录。在各自的workspace目录运行 go run [path-to-your-module] 来测试go.work里指定的依赖版本。

对于使用同一个workspace的方案,可以直接编辑go.work文件,修改use指令后面的目录地址即可。

实战操作

上述官网的搬运完毕,下面记录下我的操作

我的目录结构

|
|——————cmd
|      |
|      |——main.go
|
|——————internal
|      |
|      |——util.go
|      |——common.go
|	   |——*.go

cmd目录存放main.go函数,internal目录存放核心程序
在这里插入图片描述
在这里插入图片描述

开始之前说明一下的我的go env
在这里插入图片描述

因为要用到mod,所以GO111MPDULE要保证开启

1 package name

在这里插入图片描述
首先第一步的操作,需要统一internal目录下的package名称

这里将internal划分在名叫internalpackage包里面,每个子文件都定义为

package postmaninternal

在这里插入图片描述

2 go mod init *

第二步,在internal目录下,创建mod文件,只需要创建即可,不需要一定要再执行go get

go mod init internal

运行命令,创建mod,名叫internal,这个internalinternal文件夹包的名称,也是与外界交流的名称

3 go work init [path-to-module-one] [path-to-module-two]

internal目录的操作结束了,下面是cmd目录的操作

保险起见,cmd目录也进行一个go mod操作

go mod init postmancmd

生成一个mod,叫做postmancmd,名称其实无所谓。

接下来是正题,执行go work init

go work init ./ ../internal

创建并添加cmd目录和internal目录到go.work中,这里的internal指的是目录路径,通过../internal路径找到mod文件,得到当前文件夹的package名字叫做internal

go 1.19

use (
	.
	../internal
)

可继续在go.work中添加包路径,也可通过指令添加

go work use  [-r] moddir

4 main调用

设置完成后,在main.go里面调用包即可通过如下方式

import (
	"postmaninternal"
)

import (
	postmaninternal "postmaninternal"
)

postmaninternal "postmaninternal"前面的postmaninternal其实是类似于全局变量,给"postmaninternal"包起个在当前文件内的别称,类似与一个局部变量或者结构体什么的,可有可无,看个人习惯
在这里插入图片描述

5 replace

如果我要替换我的包,应该怎么弄呢?

很简单,通过如下操作实现
在这里插入图片描述
这步其实也验证了如何在自己发布包到GitHub上时,如何方便切换本地和远程的调试包版本的问题。

总结

go work文件只存在于main函数在的目录位置

需要调用的package包,其package包目录生成mod文件(仅需要go mod init *生成即可)

work文件在上述应用场景中主要适用于本地调试和使用,如果要发布,提供给别人使用,建议通过replace的操作将文件位置替换为github位置(该位置目录下需有mod文件)

完结撒花!

外研版(一起)英语二年级上册 Module5 Unit2I go home(课件).pptx
10-27
这篇课件是针对外研版(一起)英语二年级上册Module5 Unit2设计的,主题为"I go home",旨在帮助学生学习和掌握与时间、日常生活活动相关的英语表达。以下是一些重要的知识点: 1. **时间表达法**:本课件通过一...
go work 笔记 (多模块工作区)
云满笔记
08-21 6691
go work 笔记 (多模块工作区)
go1.18工作区提高开发效率
最新发布
leijmdas的专栏
09-01 244
这是通过在 go.work 文件中定义模块的本地路径来实现的。一旦你设置了模块间的引用,你可以在工作区的任何地方使用 go build 或 go test 命令来构建和测试代码,这些命令会考虑到所有模块的依赖关系。你可以使用 go mod tidy 命令来管理依赖,它会根据你的 go.work 文件和模块的 go.mod 文件来添加或移除依赖。当你使用本地路径引用模块时,你需要确保这些路径在工作区内是可访问的,并且 go.mod 文件中的模块路径与实际路径相匹配。
Linux基础-module命令使用(理论+实战)
qq_27815483的博客
07-04 1120
本文内容主要有Linux系统moddule命令介绍、自定义modulefile文件、module常用命令等
Golang使用go mod 导入本地库
hungrylion的博客
11-30 5335
Goland使用go mod 导入本地库 主要分为两种情况:一种是在同一个项目下导入,一种是两个不同项目 我的gopath路径在D:gowork 同一个项目导入 这种情况是不需要改动go.mod文件的 文件结构如下,firsttest目录下一个main.go文件,外加当前文件夹下面的InvokeDir文件夹,文件下面有个invoke.go文件,作为测试用的调用函数 1.go.mod文件,注意module名字为firsttest,这个名字就是module名字 main.go文件内容,可以看到直接用mod
史上最全的Go语言模块(Module管理详解(基于Go1,2024年最新字节跳动Golang内部学习资料泄露
2401_84281594的博客
04-16 642
可能细心的读者会发现一个问题,使用go.work的use指令,模块路径问题是解决了,但还有一个问题解决,那就是模块名问题,如果修改模块名(如改变了模块名的网址),仍然需要修改大量的源代码。如果使用了replace指令,use指令中对应模块的路径可以去掉了,当然,也可以保留这些路径,如果在use指令中保留了模块路径,那么在引用模块时,既可以使用在模块的go.mod文件中定义的模块名(module xxx中的xxx),也可以使用replace指令为模块起的别名。
go work 不同包下mod + work实现.go文件的互相调用
赵凯月的博客
09-07 960
需要注意的是,在go.work中添加了子模块的路径,否则在main.go 中会报错如下。
golang 1.18 go work 使用
gitxuzan
06-20 3421
go work 的使用
Go1.18 新特性 — 泛型、Fuzzing、work工作区
程序猿的世界
03-16 1871
本文源码:https://github.com/why444216978/go1.18-features-demo Fuzzing Fuzzing,又叫 fuzz testing,中文叫做模糊测试或随机测试。其本质上是一种自动化测试技术,更具体一点,它是一种基于随机输入的自动化测试技术,常被用于发现处理用户输入的代码中存在的bug和问题。 在具体实现上,Fuzzing不需要像单元测试那样使用预先定义好的数据集作为程序输入,而是会通过数据构造引擎自行构造或基于开发人员提供的初...
go work的使用方法
weixin_49369316的博客
03-17 3780
go work的使用方法
Go 1.18 workspace 使用初体验
Seekload
03-18 5739
hi,大家好,我是好久有更新的 haohongfan。Go 1.18 终于正式发布了,本次版本更新中 Go mod 有个很实用的功能 “multi-module workspaces”....
go work 工作区
m0_70556273的博客
09-05 2201
我们的代码在mypkg中,需要开发的第三方依赖在workmod中,我们可以把所有需要开发的依赖都放在workmod下,然后加入到go.work中进行开发调试。此时我发现cast包有bug或者需要对cast包加入新功能,那我就需要对cast包进行开发,在1.18前对依赖包进行开发调试是很麻烦的。创建目录 workmod(这一步可要可不要,只要一会儿指定的目录对就行,只要这个目录不要放在mypkg里面就行)此时我们对cast的依赖就成了本地这个文件了,对 go-spew等其他依赖保持不变。
外研一起小学英语五下《Module7Unit 1 My father goes to work at 8 o'clock eve
09-11
这篇文档是关于外研社小学五年级下册英语Module7 Unit 1的教学教案,主题为"My father goes to work at 8 o'clock every morning"。教案详细规划了教学目标、重点和难点、教学方法以及五个主要步骤,旨在帮助学生...
weworkapi_python:wework api的官方库https:work.weixin.qq.comapidoc
01-28
更多来自个人开发者的其他语言的库推荐: python: : (企业微信团队) Ruby: : MyColorway(个人开发者) php: : (企业微信团队) golang: : (企业微信团队) golang: : (个人开发者) 导向器 ├──...
gomod:去模块模板
03-28
7. **工作区模式**:当需要同时处理多个相关模块时,可以使用`GO111MODULE=on`和`GOFLAGS=-mod=work`环境变量启用工作区模式。 8. **go mod vendor**:将所有依赖项复制到项目中的`vendor`目录,这样在离线环境中也...
2020春五年级英语下册Module7单元综合检测1外研版三起
09-09
这篇资料是针对五年级下册英语Module 7的单元综合检测,主要涵盖了...以上是这份五年级英语下册Module 7单元综合检测所涵盖的主要知识点,涉及词汇、语法、日常表达等多个方面,旨在帮助学生巩固和提升他们的英语能力。
Go工作区模式
大坤
10-09 228
运行go mod tidy命令以同步 example.com/hello 模块的依赖项,添加代码所需但尚未在模块中跟踪的依赖项。该命令指定 example.com/greetings 应替换为 …/greetings 以定位依赖项。如果你这时候直接 go run。可能会出现如下报错,是有将本模块加入工作区中,导致运行错误。这时候需要回到工作区目录 workspace-main。仅包含版本信息,因为当前是空白的工作区,只有初始化行为。回到工作区目录 workspace-main。写入hello.go代码。
Go 1.18 新特性多模块工作区教程-让多模块开发变得简单
link_km的博客
03-21 1010
随着 2022 年 3 月 15 日 go 1.18 正式发布,新版本除了对性能的提升之外,还引入了很多新功能,其中就有 go 期盼已久的功能泛型(Generics),同时还引入的多模块工作区(Workspaces)和模糊测试(Fuzzing)。
go work模块与go mod包管理是的注意事项
个人学习笔记库,一篇一篇记录成长的足迹
04-15 737
go work使用是出现missing dot in first path element的问题解决方案。
go语言work机制
03-09
感谢您的提问。Go语言work机制是指在Go语言中,使用goroutine和channel实现的一种并发模型,可以让程序在多个任务之间高效地切换,提高程序的并发性能。具体来说,goroutine是一种轻量级的线程,可以在程序中创建多个goroutine并发执行,而channel则是一种用于goroutine之间通信的机制,可以实现数据的传递和同步。通过这种机制,Go语言可以轻松地实现高并发和高性能的程序。希望这个回答能够帮助您。
写文章

热门文章

  • 2022小米红米手机最新最全MIUI刷机教程内测版到稳定版 不清除数据(线刷、卡刷) 43420
  • 使用VSCode实现Java项目管理 Maven相关插件及配置(Maven换源) 36125
  • 缓冲、运放、跟随电路详解及区分 35985
  • 音频信号的基波、谐波 27772
  • 【ZYNQ】从入门到秃头01 初识ZYNQ(PS和PL之间连接) 26577

分类专栏

  • 失真度测试 10篇
  • 计算机 18篇
  • Go 11篇
  • Java 3篇
  • STM32 37篇
  • AI 16篇
  • ZYNQ 11篇
  • i.MX6 70篇
  • Linux 27篇
  • 网络传输 6篇
  • QT 4篇
  • C语言不牢,地动山摇 6篇
  • 操作系统 12篇
  • Python 5篇
  • FPGA 3篇
  • BP商业策划书 1篇

最新评论

  • FFT频谱分析(补零、频谱泄露、栅栏效应、加窗、细化、频谱混叠、插值),Matlab、C语言代码

    xiaowodaweiwang: 老师您好,请问什么叫做“有用信号在频域上分得过细,从测量的角度噪声就可以更加趁虚而入了”?这块不太能理解

  • IIC通讯 | 基于STM32的LM75模块的使用以及故障排查

    2401_82374594: 能分享一下工程文件吗

  • 从Matlab总谐波失真(THD)仿真到C语言总谐波失真(THD)应用

    平凡的小菜鸟: 我没用他的C

  • 从Matlab总谐波失真(THD)仿真到C语言总谐波失真(THD)应用

    xjfzsys789: 我输出也是0.658397,你那边有问题吗?

  • CubeMX安装教程及安装过程问题处理(cube打不开/cube无法生成文件/jre环境配置有问题)

    weixin_41643182: javac -version 命令不好使,环境变量配置怎么办,请详细说明一下呗?

大家在看

  • [Angular] 从零开始使用 Angular CLI 创建 Angular 项目
  • Type-C 诱骗取电快充协议芯片,支持取电电压5V、9V、12V、15V、20V 397
  • Boston波士顿房价预测 +两种回归算法建模和分析 1068
  • PD 取电快充协议芯片 支持广泛应用,最高取电电压100W
  • 【Proteus仿真】基于51单片机的简易电压表制作(可串口远程调控) 996

最新文章

  • MySQL:表结构设计、char 和 varchar、索引数据结构、事务隔离级别、分表设计
  • Redis:持久化、线程模型、大 key
  • 5GC 网元AMF、SMF、AUSF、UPF、PCF、UDM、NRF、NSSF、NEF介绍
2024年8篇
2023年9篇
2022年16篇
2021年117篇
2020年71篇
2019年3篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家防城港商场美陈雕塑玻璃钢玩偶卡通人物雕塑漯河标牌标识玻璃钢雕塑厂家惠州市园洲镇玻璃钢雕塑厂家抚州环保玻璃钢雕塑焦作佛像玻璃钢彩绘雕塑玻璃钢道教雕塑费用毕节商场美陈门头玻璃钢棒棒糖雕塑图片广州定做玻璃钢卡通雕塑揭阳小区玻璃钢雕塑定做玻璃钢发光雕塑制作过程玻璃钢雕塑景观摆件评语安徽孔子玻璃钢雕塑公明商场美陈装饰玻璃钢翻模雕塑漳州玻璃钢雕塑凳子玻璃钢花盆型号卡通雕塑玻璃钢哪家合适现代玻璃钢卡通雕塑生产江苏玻璃钢人物雕塑定做价格福建步行街玻璃钢雕塑销售电话日照人物玻璃钢雕塑定制秋季商场美陈价格标牌玻璃钢卡通雕塑定制主题玻璃钢人物雕塑供应萍乡户外玻璃钢雕塑禅城玻璃钢人物雕塑欢迎前来咨询郑州定制玻璃钢雕塑批发城市景观玻璃钢雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化