Go 的依赖管理,也就是 Go Module。从推出到现在,也已经有了一定的年头了,吐槽一直很多,官方也不断地在进行完善。

Go1.18 将会推出一个新特性:Multi-Module Workspaces,用于支持 Module 多工作区,能解决以往的一系列问题。

今天将由煎鱼带大家一起深入学习。

背景

在日常使用 Go 工程时,总会遇到 2 个经典问题,特别的折腾人。

如下:

  1. 依赖本地 replace module。

  2. 依赖本地未发布的 module。

replace module

第一个场景:像是平时在 Go 工程中,我们为了解决一些本地依赖,或是定制化代码。会在 go.mod 文件中使用 replace 做替换。

如下代码:

replace golang.org/x/net => /Users/eddycjy/go/awesomeProject

这样就可以实现本地开发联调时的准确性。

问题就在这里:

  • 本地路径:所设定的 replace 本质上转换的是本地的路径,也就是每个人都不一样。

  • 仓库依赖:文件修改是会上传到 Git 仓库的,不小心传上去了,影响到其他开发同学,又或是每次上传都得重新改回去。

用户体验非常差,很折腾人。

未发布的 module

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

如下代码:

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

如果这个时候运行 go run 或是 go mod tidy,都不行,会运行失败。

报如下类似错误:

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

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

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

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

对新入门的同学非常不友好,很要命。

工作区模式

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

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

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

我们可以通过 go help 来查看,如下:

$ go1.18beta1 help work
Usage:go work <command> [arguments]The commands are:edit        edit go.work from tools or scriptsinit        initialize workspace filesync        sync workspace build list to modulesuse         add modules to workspace fileUse "go help work <command>" for more information about a command.

只要执行 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 1.18use (./mod ./tools
)

新的 go.work 与 go.mod 语法一致,也可以使用 replace 语法:

go 1.18use (...)replace golang.org/x/net => example.com/fork/net v1.4.5

go.work 文件内共支持三个指令:

  • go:声明 go 版本号,主要用于后续新语义的版本控制。

  • use:声明应用所依赖模块的具体文件路径,路径可以是绝对路径或相对路径,可以在应用命目录外均可。

  • replace:声明替换某个模块依赖的导入路径,优先级高级 go.mod 中的 replace 指令。

若想要禁用工作区模式,可以通过 -workfile=off 指令来指定。

也就是在运行时执行如下命令:

go run -workfile=off main.gogo build -workfile=off

go.work 文件是不需要提交到 Git 仓库上的,否则就比较折腾了。

只要你在 Go 项目中设置了 go.work 文件,那么在运行和编译时就会进入到工作区模式,会优先以工作区的配置为最高优先级,来适配本地开发的诉求。

至此,工作区的核心知识就介绍完毕了。

总结

今天给大家介绍了 Go1.18 的新特性:多 Module 工作区模式。其本质上还是为了解决本地开发的诉求。

由于 go.mod 文件是与项目强关联的,基本都会上传到 Git 仓库中,很难在这上面动刀子。直接就造了个 go.work 出来,纯本地使用,方便快捷。

使用新的 go.work,就可以在完全是本地文件上各种捣鼓了,不会对其他成员开发有其他影响。

你觉得怎么样呢?:)

参考资料

[1]

Proposal: Multi-Module Workspaces in cmd/go: https://go.googlesource.com/proposal/+/master/design/45713-workspace.md

关注煎鱼,获取业内第一手消息和知识

Go1.18 新特性:多 Module 工作区模式相关推荐

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

    文章目录 背景 举例:未发布的 module Go1.18 新特性:多模块(Multi-Module)工作区模式 Go1.18 工作区模式 初始化一个新的工作区 go work use 添加新的模块到 ...

  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. React 18 新特性(三):渐变更新

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

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

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

  6. 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 ...

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

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

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

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

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

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

最新文章

  1. JavaScript夯实基础系列(一):词法作用域
  2. JDK源码解析 InputStream类就使用了模板方法模式
  3. jQuery 基本操作
  4. restful风格使用小例
  5. python table_用python解析word文件(二):table
  6. python在docx指定位置插表格_超简单Python将指定数据插入到docx模板指定位置渲染并保存...
  7. cookie与session以及他们的常规用途——web开发必须熟知的知识
  8. 直接选择排序算法汇总
  9. CSharpThinking---C# 要点(附加三)
  10. 初探socket 报式
  11. XMind8 Update9下载安装
  12. Android系统镜像文件
  13. 从下单到享用,美团外卖背后的分布式架构设计
  14. ios-自建网页在浏览器安装ipa包
  15. 天猫精灵智能家居对接,及天猫iot官网配置图文讲解(一)
  16. android内核函数,Android display架构分析三-Kernel Space Display架构介绍
  17. docker容器正常启动宿主机却无法正常访问
  18. uniapp自定义导航栏,高度,自定义组件
  19. [读书笔记]《自控力》
  20. MNIST数据集的gist特征提取(含全部实例代码下载地址)

热门文章

  1. tensorflow-yolo3系列配置文章汇总
  2. Python基础班---第一部分(基础)---Python基础知识---计算机组成原理
  3. SpringMVC HandlerMethodReturnValueHandler扩展
  4. 渐进增强和优雅降级有什么区别
  5. Oracle 11gR2 ORA-12638 身份证明检索失败解决方法
  6. Mac清理软件为苹果系统迅速减压
  7. Linux内核基础--事件通知链(notifier chain)【转】
  8. NHibernate从入门到精通系列(5)——持久对象的生命周期(下)
  9. Node.js Server
  10. 一段话系列-正则基础