Tony Bai · Go 语言第一课
Tony Bai
资深架构师,tonybai.com 博主
21492 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 59 讲
开篇词 (1讲)
结束语 (1讲)
Tony Bai · Go 语言第一课
15
15
1.0x
00:00/00:00
登录|注册

07|构建模式:Go Module的6类常规操作

特殊情况:使用vendor
移除一个依赖
升级依赖版本到一个不兼容版本
添加一个主版本号大于1的依赖
升级/降级依赖的版本
为当前项目添加一个依赖包
go mod命令
基本概念和工作原理
Go包发布注意事项
Go Module构建模式
总结

该思维导图由 AI 生成,仅供参考

你好,我是 Tony Bai。
通过上一节课的讲解,我们掌握了 Go Module 构建模式的基本概念和工作原理,也初步学会了如何通过 go mod 命令,将一个 Go 项目转变为一个 Go Module,并通过 Go Module 构建模式进行构建。
但是,围绕一个 Go Module,Go 开发人员每天要执行很多 Go 命令对其进行维护。这些维护又是怎么进行的呢?
具体来说,维护 Go Module 无非就是对 Go Module 依赖包的管理。但在具体工作中还有很多情况,我们接下来会拆分成六个场景,层层深入给你分析。可以说,学好这些是每个 Go 开发人员成长的必经之路。
我们首先来看一下日常进行 Go 应用开发时遇到的最为频繁的一个场景:为当前项目添加一个依赖包

为当前 module 添加一个依赖

在一个项目的初始阶段,我们会经常为项目引入第三方包,并借助这些包完成特定功能。即便是项目进入了稳定阶段,随着项目的演进,我们偶尔还需要在代码中引入新的第三方包。
那么我们如何为一个 Go Module 添加一个新的依赖包呢?
我们还是以上一节课中讲过的 module-mode 项目为例。如果我们要为这个项目增加一个新依赖:github.com/google/uuid,那需要怎么做呢?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Go Module是Go语言中用于管理依赖包的工具。本文详细介绍了Go Module的六类常规操作,包括添加依赖包、升级/降级依赖版本、导入主版本号大于1的依赖包路径、移除依赖以及使用vendor机制。通过示例代码和命令演示了手动执行go get命令和自动分析下载依赖项的go mod tidy命令。文章还强调了语义导入版本机制的原则,以及如何使用go mod vendor命令进行依赖包的管理。总的来说,本文通过实际操作和技术原理的解释,帮助读者快速了解Go Module的常规操作,为Go开发人员提供了实用的技术指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Tony Bai · Go 语言第一课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(59)

  • 最新
  • 精选
  • lesserror
    Tony Bai 老师这一讲的内容很实用,可以说有很多Go教程都没有涉及到这块知识的归纳总结。 麻烦老师抽空回答一下我以下的疑问: 1. 空导入的方式的作用吗?我看很多源码中有使用这种包导入的方式。 2. 在go module构建模式下,怎么对vendor目录的有无进行取舍呢?老师有什么实战建议呢?

    作者回复: 问题1: 像下面代码这样的包导入方式被称为“空导入”: import _ "foo" 空导入也是导入,意味着我们将依赖foo这个路径下的包。但由于是空导入,我们并没有显式使用这个包中的任何语法元素。那么空导入的意义是什么呢?由于依赖foo包,程序初始化的时候会沿着包的依赖链初始化foo包,我们在08里会讲到包的初始化会按照常量->变量->init函数的次序进行。通常实践中空导入意味着期望依赖包的init函数得到执行,这个init函数中有我们需要的逻辑。 问题2: 通常我们直接使用go module(非vendor)模式即可满足大部分需求。如果是那种开发环境受限,因无法访问外部代理而无法通过go命令自动解决依赖和下载依赖的环境下,我们通过vendor来辅助解决。

    2021-10-27
    8
    37
  • blur
    go mod edit -require=github.com/sirupsen/logrus@v1.7.0这个指令在win 上的golangd好像会因github 后面的那个 . 识别不出来path,加引号变成 go mod edit -require="github.com/sirupsen/logrus@v1.7.0"就可以了

    作者回复: 感谢提供不同平台的差异。

    2021-10-28
    2
    25
  • Aaron Liu
    如果之前引用的包是v1,之后升级v2,go get可以替换引用的包,但源码里的import要怎么改,如果很多go文件都引用了呢

    作者回复: 源码中必须要改,改为xxx/v2。这个要么手动改,要么使用IDE/编辑器提供的工具进行统一替换。

    2021-10-27
    6
    17
  • return
    老师讲太好了, 有主线 有关键细节, 请教老师, 关于vendor, 存好副本后, 一般在其他地方怎么用呢, 手动传输过去 还是 上传到代码库再下载呢

    作者回复: 如果采用vendor模式,建议与项目代码同等对待,一并上传的代码仓库中。其他地方直接下载使用。

    2021-10-27
    2
    14
  • 女干部
    老师你好, 有一个疑问困扰我很久了,这样一个例子: 安装 go get -u github.com/cweill/gotests/... 然后就可以在命令行里执行 gotests了, 我想知道/...这是个什么写法, 还有gotests.exe,是怎么构建并被放到我的%USERPROFILE%\go\bin目录下的 辛苦

    作者回复: 1. ...表示gotests下面的所有的包 2. go get会下载gotests下面所有的包,如果gotests是一个可执行文件的项目(带有main包main函数). go get会在下载包之后构建这个项目并把可执行文件放入$GOPATH/bin下。

    2021-12-01
    13
  • 运维夜谈
    老师这个专栏绝了,真的收获很大! 老师,想请教个问题,在一些无法连接外网的环境下,Go Module有没有类似maven和Nexus一样可以搭建自己的私库,然后私库去连接外部代理去下载依赖?

    作者回复: 目前私有代理做的比较好的有goproxy.io、goproxy.cn、athen等。我在后面的加餐中会聊到这个话题。

    2021-12-22
    3
    11
  • lesserror
    大白老师,如果我想升级go.mod中定义的Go版本的话,最佳实践是不是这么操作: go mod edit -go=1.17

    作者回复: 这个操作我觉得没啥最佳实践,我一般直接用vim打开go.mod文件,然后改就是了:)。

    2021-12-17
    2
    6
  • ll
    我是一名前端,初“卷”到go,对比 go module 对比 npm (node 的包管理): 1. vendor 类似于 node 项目中的 node_modules, 2. 默认条件下用 go get xxx 相当于 npm i -g xxx, 总之,我的方法就是结合新学的内容,和我熟悉的其他语言体系做对比;这样一是方便记忆,二可以更好的理解新知识。 老师的课条理清晰,深入浅出,点赞

    作者回复: 欢迎来到go世界。

    2021-11-17
    5
    6
  • Paradise
    Tony 的专栏不适合跳着看,因为细节干货太多啦哈哈,感谢老师

    作者回复: 👍。嗯嗯,尽量按顺序看。

    2022-04-09
    4
  • jacky
    讲得挺好,就是更新有点慢啊,这得更到啥时候

    作者回复: 一周三篇,已经很快了:)。写稿不易,欢迎继续、持续支持!

    2021-10-28
    4
收起评论
显示
设置
留言
59
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部