golang的包管理是一直是为人诟病之处,从golang1.5引入的vendor机制,到准官方工具dep,目前为止还没一个简便的解决方案。

不过现在go modules随着golang1.11的发布而和我们见面了,这是官方提倡的新的包管理,乃至项目管理机制,可以不再需要GOPATH的存在。

go modules的初始化

现在modules机制仍在早期阶段,所以golang提供了一个环境变量“GO111MODULE”,默认值为auto,如果当前目录里有go.mod文件,就使用go modules,否则使用旧的GOPATH和vendor机制,因为在modules机制下go get只会下载go modules,这一行为会在以后版本中成为默认值,这里我们保持auto即可,如果你想直接使用modules而不需要从GOPATH过度,那么把“GO111MODULE”设置为on。

modules和传统的GOPATH不同,不需要包含例如src,bin这样的子目录,一个源代码目录甚至是空目录都可以作为module,只要其中包含有go.mod文件。

我们就用一个空目录来创建我们的第一个module:

要初始化modules,需要使用如下命令(假设已经安装配置好golang1.11):

go mod init [module name]

我们的module叫test,所以就是:

go mod init test

初始完成后会在目录下生成一个go.mod文件,里面的内容只有一行“module test”。

包管理

那么我们怎么进行包管理呢?别担心,当我们使用go build,go test以及go list时,go会自动得更新go.mod文件,将依赖关系写入其中。

如果你想手动处理依赖关系,那么使用如下的命令:

go mod tidy

这条命令会自动更新依赖关系,并且将包下载放入cache。

下面我们使用chromedp的一个简单example作为实验代码main.go,看下go modules是如何处理包的依赖关系的。

我们手动运行go mod tidy:

查找并下载包

我们发现多了一个go.sum,我们看看它里面是什么内容:

没错,你已经猜到了,这是我们直接引用的package和它自身需要的以来的版本记录,go modules就是根据这些去找到需要的packages的。

顺带一提,如果我们不做任何修改,默认会使用最新的包版本,如果包打过tag,那么就会使用最新的那个tag对应的版本。

下面我们使用go build来编译我们的代码:

go build

值得注意的是,新增了一个编译选项“-mod”,它有如下的可选值:

go build -mod=readonly

在这个模式下任何会导致依赖关系变动的情况都将导致build失败,前面提到过build能查找并更新依赖关系,使用这个选项可以检查依赖关系的变动。

go build -mod=vendor

意思是忽略cache里的包,只使用vendor目录里的版本。

构建完成后目录结构如下:

我们的代码成功构建了,包管理都由go modules替我们完成了。

包的版本控制

包管理的另外一项重要功能就是包的版本控制。modules同样可以做到。

在介绍版本控制之前,我们要先明确一点,如果上层目录和下层目录的go.mod里有相同的package规则,那么上层目录的无条件覆盖下层目录,目的是为了main module的构建不会被依赖的package所影响。

那么我们看看go.mod长什么样:

module testrequire github.com/chromedp/chromedp v0.1.2

如果有多个依赖,可以是这样的:

module github.com/chromedp/chromedprequire (github.com/chromedp/cdproto v0.0.0-20180713053126-e314dc107013github.com/disintegration/imaging v1.4.2github.com/gorilla/websocket v1.2.0github.com/knq/sysutil v0.0.0-20180306023629-0218e141a794github.com/mailru/easyjson v0.0.0-20180606163543-3fdea8d05856golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81
)

前面部分是包的名字,也就是import时需要写的部分,而空格之后的是版本号,版本号遵循如下规律:

vX.Y.Z-pre.0.yyyymmddhhmmss-abcdefabcdef
vX.0.0-yyyymmddhhmmss-abcdefabcdef
vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdefabcdef
vX.Y.Z

也就是版本号+时间戳+hash,我们自己指定版本时只需要制定版本号即可,没有版本tag的则需要找到对应commit的时间和hash值。

默认使用最新版本的package。

现在我们要修改依赖关系了,我们想使用chromedp 的v0.1.0版本,怎么办呢?

只需要如下命令:

go mod edit -require="github.com/chromedp/chromedp@v0.1.0"

@后面加上你需要的版本号。go.mod已经修改了:

module testrequire github.com/chromedp/chromedp v0.1.0

我们还需要让go modules更新依赖关系,这里我们手动go mod tidy之后:

注意颜色较深的那两行,我们已经切换到了v0.1.0版本了。

go modules是一个很大的主题,以后我还将进一步介绍它。

因为go1.11刚发布不久,这篇文件作为探路,必定会有错误和疏漏,欢迎大家指正!

原文出处:https://www.cnblogs.com/apocelipes/p/9534885.html

作者:慕尼黑8549860
链接:http://www.imooc.com/article/74033
来源:慕课网

golang包管理解决之道——go modules初探相关推荐

  1. Golang包管理工具之govendor的使用

    本文个人博客地址为:http://www.huweihuang.com/article/golang/govendor-usage/ 本文个人博客地址为:https://huweihuang.net/ ...

  2. Golang包管理工具(三)之dep的使用

    本文个人博客地址:http://www.huweihuang.com/article/golang/dep-usage/ 更多golang包管理工具参考 - dep的使用 - glide的使用 - g ...

  3. Golang包管理工具govendor的使用

    1. govendor简介 golang工程的依赖包经常使用go get命令来获取,例如:go get github.com/kardianos/govendor ,会将依赖包下载到GOPATH的路径 ...

  4. Golang包管理工具(四)之go-modules的使用

    本文个人博客地址:https://www.huweihuang.com/golang-notes/introduction/package/go-modules.html 1. Go modules简 ...

  5. Go Modules依赖包管理与Go Modules实战

    目录 Go Modules依赖包管理 Go Modules 简介 Go 包管理的历史 Go1.5 版本前:GOPATH Go1.5 版本:Vendoring "百花齐放":多种 G ...

  6. golang中的包管理工具——govendor和godep简单学习

    为什么用vendor目录 依赖问题 我们知道,一个工程稍大一点,通常会依赖各种各样的包.而Go使用统一的GOPATH管理依赖包,且每个包仅保留一个版本.而不同的依赖包由各自的版本工具独立管理,所以当所 ...

  7. go build不从本地gopath获取_Go包管理GOPATH、vendor、go mod机制

    简介 Golang 作为开源编程语言,在 2012 年编程语言 Go 1 发布之后,一直在不断发展,并伴随着云原生而广泛进入各大公司. 在互联网发展至今,软件系统不断膨胀. 各个编程语言也都逐步支持了 ...

  8. Rust学习笔记之非常好用的包管理器Cargo

    包管理器 Rust 的 Cargo 应该算是众多包管理器当中非常好用的一个.如果接触过前端开发,对 npm/yarn 应该是不陌生的,Go 语言也有 go tool.这些包管理器用来下载正确的依赖库. ...

  9. 深入理解Golang包导入

    Golang使用包(package)这种语法元素来组织源码,所有语法可见性均定义在package这个级别,与Java .python等语言相比,这算不上什么创新,但与C传统的include相比,则是显 ...

最新文章

  1. [转载] Win7下MATLAB 7.0下载地址和详细安装
  2. 诺基亚手机运行linux,Ubuntu携手诺基亚Linux进军手机操作系统将改变市场
  3. Java 8 Friday:大多数内部DSL已过时
  4. 藏不住了,这就是阿里 AI 的真正实力!
  5. matlab 函数优化问题,matlab求解最优化问题 Matlab在最优化问题中的应用举例.doc
  6. 内卷加速 | 本科毕业出国率下降,考研or保研?
  7. 仿生软体机器人就业咋样_余存江课题组《先进材料》封面:智能自适应软体机器人获得新突破...
  8. python seaborn 散点图矩阵_Kaggle、Python数据可视化seaborn(四):散点图
  9. win7系统更换锁屏壁纸
  10. 【新知实验室】腾讯云TRTC初体验
  11. AMD处理器的发展历程
  12. 前端判断是微信浏览器还是qq还是微信浏览器
  13. 理解 Joomla 的几个概念 - 读《Aprees.Begging.Joomla.From.Novice.to.Professional》
  14. 宋宝华:为什么numactl内存绑定对代码段不起作用
  15. 云渲染技术在虚拟仿真医疗培训中的应用
  16. 软件开发项目可行性分析报告样例
  17. x61安装ghost xp
  18. 迅雷11抢先体验版,免费2T空间可离线下载高速取回
  19. 基于Arduino的土壤湿度检测
  20. Android10.0 MTK 平台 Launcher3 修改定制

热门文章

  1. Sensors Data:初创公司构建数据分析平台
  2. [Go] Cookie 使用简介
  3. ThreadLocal_OSIV模式_FIlter_Web ajax
  4. Android数据库--Sqlcipher的使用(一)
  5. 近期北京动点软件发现XXX公司盗用我公司WPF项目案例
  6. NIOS II 创建示例设计_Quartus II 9.0
  7. 不越狱无硬件,轻松搞定iPhone投影与录屏
  8. 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用48
  9. ChainBuilder Connect SOA平台解决方案的案例研究
  10. 按钮更新datagridview