目录

  • 基本使用
    • 环境准备
    • 初始化go module环境
    • 下载依赖包
    • 添加新依赖包
    • 将依赖包下载到vendor目录
  • 亮点功能一:使用replace本地包替换
  • 亮点功能二:语意化版本 semver---Semantic Versioning
  • 亮点功能三:依赖包冲突问题
    • 情况1:直接 引用的包 和 间接引用的包是同一个包,但版本不同时?
    • 情况2: 间接引用的两个包是同一个包,但版本不同时?
  • 亮点功能四:自动查找包依赖
  • 总结:

前两天参加了 GopherChina 的大会收获颇多,go module算一个,下面把总结使用分享给大家,有问题希望指正。

基本使用

环境准备

  1. golang 1.11的朋友,开启 GO11MODULE=on ,并且确保实验目录不在 GOPATH 中,命令行里执行。
    export GO11MODULE=on
    export GO111MODULE=on
  2. golang 1.12的朋友,确保实验目录不在 GOPATH 中。
  3. 加速下载,命令行里执行。
    export GOPROXY=https://goproxy.io

初始化go module环境

带git的项目

  1. 直接从github上面clone一个项目下来。
  2. 直接执行 go mod init 会自动生成带git地址的packagename
➜  gomodtest_base git:(master) ✗ go mod init
go: creating new go.mod: module github.com/e421083458/gomodtest_base

不带git的项目

  1. 直接执行

go mod init packagename

下载依赖包

只下载依赖包

go mod download
➜  new_module_test go mod download
go: finding github.com/e421083458/gomodtest_dep v0.0.0-20190501153957-6ff7f41fdb83
go: finding github.com/e421083458/gomodtest_base v1.0.1
go: finding github.com/e421083458/gomodtest_base/v2 v2.0.0
go: finding github.com/jianfengye/collection v0.0.0-20190426092112-28c4a03f0c86
go: finding github.com/pkg/errors v0.8.1

拉取必须模块,移除不用的模块

go mod tidy

注意点:

  1. 如果tag对应内容有更新,需要删除pkg中的缓存内容。这点比较恶心了。
cd $GOPATH/pkg/mod
rm -rf *
  1. go get、 go run、go build 也会自动下载依赖

添加新依赖包

方法一:
直接修改 go.mod 文件,然后执行 go mod download
方法二:
使用 go get packagename@v1.2.3,会自动更新 go.mod 文件的
方法三:
go run、go build 也会自动下载依赖

将依赖包下载到vendor目录

go mod vendor

注意: 这里只会下载对应版本的包文件,不会把所有版本下载。跟之前1.11使用方式一致。

亮点功能一:使用replace本地包替换

有时候国外软件可能被墙,这个功能就能派上用场了。
main.go

main.gopackage main
import "my/example/pkg"
func main() {pkg.Hello()
}

go.mod

module my-modrequire my/example/pkg v0.0.0
replace my/example/pkg => ./pkg

replace 可以文件夹,也可以是另外一个package

module my-modrequire my/example/pkg v0.0.0
replace my/example/pkg v0.0.0 => github.com/example/pkg v0.0.0

注意点: 顶层依赖可替换但间接依赖不可替换

亮点功能二:语意化版本 semver—Semantic Versioning

semver是官方为了类库升级引入的新规范,即:
“If an old package and a new package have the same import path, the new package must be backwards compatible with the old package.” - go modules wiki "
如果旧软件包和新软件包具有相同的导入路径,则新软件包必须向后兼容旧软件包。"

main.go

package main
import ("fmt"v1 "github.com/e421083458/gomodtest_base"v2 "github.com/e421083458/gomodtest_base/v2"
)
func main(){v2.NewIntCollection("hello","sex")v1.NewIntCollection("hello")fmt.Println("hello");
}

go.mod

module new_module_testrequire (github.com/e421083458/gomodtest_base v1.0.1github.com/e421083458/gomodtest_base/v2 v2.0.0
)

亮点功能三:依赖包冲突问题

情况1:直接 引用的包 和 间接引用的包是同一个包,但版本不同时?

依赖关系:
gomodtest_test|--> gomodtest_dep         |--> gomodtest_base@v1.0.0|--> gomodtest_base@v1.0.1

go mod tidy 时,gomodtest_test会自动更新到与依赖包关联的第三方包相同版本号,并写入到go.mod,从而解决了版本冲突问题。

情况2: 间接引用的两个包是同一个包,但版本不同时?

比如以下场景:
gomodtest_test|--> gomodtest_dep  |--> gomodtest_base@v1.0.0|--> gomodtest_dep2 |--> gomodtest_base@v1.0.1

go mod tidy 时,默认使用第一个包引用版本号,gomodtest_base@v1.0.1,并写入到go.mod,这个时候就要注意两个版本是否功能完全兼容的问题了。

亮点功能四:自动查找包依赖

go mod 遵循了之前go get 自动下载依赖特性。所有的依赖包会自动全部下载。
未启用 go mod 功能的包会自动下载最高 tag 版本或最高 master commit版本
我之前也以为go mod只会自动查询使用了go mod的功能的包。

➜  new_module_test go mod download
go: finding github.com/e421083458/gomodtest_dep v0.0.0-20190501153957-6ff7f41fdb83
go: finding github.com/e421083458/gomodtest_base v1.0.1
go: finding github.com/e421083458/gomodtest_base/v2 v2.0.0
go: finding github.com/jianfengye/collection v0.0.0-20190426092112-28c4a03f0c86
go: finding github.com/pkg/errors v0.8.1

总结:

  1. 大部分场景下 go mod init 和 go mod tidy 两个命令就够用了
  2. 查看$GOPATH/pkg/mod里面的文件就知道了,mod做了一件类似maven的事把所有包都打上了版本号。
    可以说这是 golang 迈向高大上语言的标志。
    从此我们不再为多版本使用的困扰,也不再为IDE打开一个新项目后等待n分钟的生成缓存犯愁。推荐大家丢掉vendor使用统一管理。
  3. semver 将版本信息绑定进包名对于习惯了传统包管理器方案的用户来说显得有些怪异,可能需要花上一些额外时间适应。

文档引用:
https://www.cnblogs.com/apocelipes/archive/2019/01/20/10295096.html
https://github.com/golang/go/wiki/Modules#semantic-import-versioning
https://www.cnblogs.com/apocelipes/p/9534885.html
https://www.cnblogs.com/apocelipes/p/9537659.html

10分钟学会go module相关推荐

  1. UWP开发入门(十九)——10分钟学会在VS2015中使用Git

    原文:UWP开发入门(十九)--10分钟学会在VS2015中使用Git 写程序必然需要版本控制,哪怕是个人项目也是必须的.我们在开发UWP APP的时候,VS2015默认提供了对微软TFS和Git的支 ...

  2. python写好的代码怎么给别人使用-10分钟学会用python写游戏!Python其实很简单!...

    原标题:10分钟学会用python写游戏!Python其实很简单! Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以在这里给各位看官们准备了高价值Python学习视频教程 ...

  3. 百度贴吧自动发帖_引流网赚之百度贴吧引流窍门:实操引流教程百度贴吧零成本自动顶帖+10分钟学会豆瓣顶帖引流...

    引流网赚之百度贴吧窍门:实操引流教程<百度贴吧零成本自动顶帖>+<10分钟学会豆瓣顶帖引流> 关于百度贴吧的引流方式有很多,像常见的关键词排名引流,比如,百度贴吧引流效果好不好 ...

  4. NiosII软处理器快速入门- 10分钟学会NiosII(1)

    http://hi.baidu.com/hieda/blog/item/7f69080e9efb80ce7bcbe13d.html Nios简单介绍: Nios II是一个用户可配置的通用RISC嵌入 ...

  5. 手机版python3h如何自制游戏_Python 飞机大战|10 分钟学会用 python 写游戏

    Python 飞机大战|10 分钟学会用 python 写游戏 2018 年 python 语言大火, 这把火看趋势已然延续到了 2019 年! 除了在科学计算领域 python 有用武之地之外, 在 ...

  6. #今日论文推荐#1小时学会走路,10分钟学会翻身,世界模型让新生机器狗掌握多项技能

    #今日论文推荐#1小时学会走路,10分钟学会翻身,世界模型让新生机器狗掌握多项技能 人类宝宝在出生后的第1年里,就会逐渐掌握协调能力,学习坐.立.翻滚和爬行. 那么机器人呢? 机器人能完成多复杂的任务 ...

  7. 惠普服务器win10安装系统教程,惠普笔记本U盘装Win10系统图文教程 10分钟学会重装系统...

    U盘装系统,是电脑爱好者"老生常谈"的一个话题,在"电脑百事网"能找到许多类似的教程文章,不过今天的教程与往期有些不一样,首先是制作启动U盘,选用了一些更安全的 ...

  8. 最完整的WordPress建站教程,新手10分钟学会建站

    假如你是一个菜鸟,也能从0开始,10分钟学会搭建(wordpress,Dede,Discuz!..)网站. 网站=域名+空间和数据库+网站程序+模板 1准备材料 [域名] 网址就相当于家的住址,记住和 ...

  9. pulsar 容量_[Pulsar系列] 10分钟学会Pulsar消息系统概念

    Apache Pulsar Pulsar是一个支持多租户的.高性能的服务与服务之间消息通讯的解决方案,最初由雅虎开发,现在由Apache软件基金会管理. Pulsar在Yahoo的生产环境运行了三年多 ...

最新文章

  1. Socket编程与TCP
  2. iOS开发 tabBarController选中状态
  3. Go程序:利用命令行参数做四则运算
  4. 西安石油大学计算机类分专业,西安石油大学2019年分专业录取分数解读
  5. mysql常用的语句_MySQL常用语句集锦
  6. java wav 转 mp3_使用jave2将音频wav转换成mp3格式
  7. ERROR in ./src/vue/login.vue?vuetype=templateid=28b333d2 2:0 Module parse failed: Unexpected toke
  8. 悲伤是一种毒,会上瘾
  9. wifi6 feature 详解
  10. Compilation error :org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException
  11. 为指针分配和释放空间
  12. Vue导入上传Excel
  13. Kotlin中单利常用的五种写法
  14. Matlab App Designer 学习笔记
  15. 面向对象的三个基本特征
  16. Unity的碰撞检测
  17. 【日记】20220219启动项目蓝屏
  18. C#检索局域网内主机的IP、MAC地址
  19. 3.vue开发实例演示
  20. HTML5 汉字转化为拼音,带读声,穷举多音字

热门文章

  1. VMI管理常见的业务场景(一)
  2. C 语言实现简易区块链
  3. 在线装机测试软件,完美装机大师工具V3.0专业版
  4. 苹果手机怎么在照片上添加文字_用手机修图软件,给照片添加精美的文字排版,如何操作最简单?...
  5. SylixOS快问快答
  6. python编写游戏测试机器人客户端(一)
  7. 给中国学生的第七封信:21世纪最需要的7种人才(李开复)
  8. android支持svg格式图片么,Android Studio2.0中使用SVG图片格式
  9. jQuery的页面加载完毕事件?
  10. 洛谷P8255 解法 2020328