在一些Java的项目中,有 Maven等这些版本管理工具,能够很好的管理各类版本依赖关系,可是在 Golang 的项目中,以前官方并无提供版本管理工具,之前都是用 go get 进行安装, 随着项目的变大, 就处理这种依赖关系就变得很麻烦, 原文。git
若是你对Go感兴趣, 能够关注个人公众号: GoGuidergithub
为了解决版本依赖问题, 官方出了一个 vendor 机制,将项目依赖的包都放在该目录中,但这也并无很好地管理依赖的版本。安全
由于vendor 机制有几个大的问题:bash
一、须要将外部库放到项目中, 致使项目体积变得很大
二、项目版本很难指定和控制app
以后官方出了一个准官方版本管理工具 go dep,这也算是 go modules 的前身了吧。随着 Go1.11 的发布,Golang 给咱们带来了 module 全新特性,这是 Golang 新的一套依赖管理系统。在 Go1.12发布后,go modules 进一步稳定,但官方仍是没有将其设为默认机制,因此踩坑之路是必须的,本篇文章除了详细说明 go modules 的特性以及使用以外,还总结了我在这个过程当中遇到的一些“坑”。ide
目前 go help mod
、go help modules
、go help module-get
能够了解一些go module的用法, 不过有些用法仍是介绍的不够详细, 须要咱们进行猜; 因此今天整理了一篇文章和你们一块儿了解。工具
随着go1.12就要发布了。这是首个将go modules归入正式支持的稳定版本。go modules引入go.mod, 咱们能够更好的管理外部库以及版本了。ui
在使用go get 若是咱们想指定一些版本信息, 能够参照下面的操做:google
go get github.com/mqu/go-notify@ef6f6f49
spa
在go.mod文件中咱们也须要这样指定, 目标库 带上指定版本, 这样能够安装时明确版本, 避免不避免的麻烦, 增长项目的肯定性和安全性。
因此 在go.mod中也须要这样指定版本
module github.com/goguider/hello
go 1.12
require (
cloud.google.com/go v0.37.1 // indirect
github.com/PuerkitoBio/goquery v1.5.0
github.com/araddon/dateparse v0.0.0-20190223010137-262228af701e
github.com/b3log/gulu v0.0.0-20190806034141-2b1d1b33ff3d
github.com/b3log/lute v0.0.0-20190922061740-a6de76dabec1
github.com/beevik/etree v1.1.0 // indirect
github.com/bluele/gcache v0.0.0-20190301044115-79ae3b2d8680
...
)
复制代码
go modules 发布以后,就彻底统一了包引用的地址,如上面咱们说的建立 go.mod 文件后, 使用初始化内容的第一行就是咱们说的项目依赖路径,一般来讲该地址就是项目的仓库地址,全部须要引用项目包的地址都填写这个地址,不管是内部之间引用仍是外部引用
download download modules to local cache (下载依赖的module到本地cache))
edit edit go.mod from tools or scripts (编辑go.mod文件)
graph print module requirement graph (打印模块依赖图))
init initialize new module in current directory (再当前文件夹下初始化一个新的module, 建立go.mod文件))
tidy add missing and remove unused modules (增长丢失的module,去掉未用的module)
vendor make vendored copy of dependencies (将依赖复制到vendor下)
verify verify dependencies have expected content (校验依赖)
why explain why packages or modules are needed (解释为何须要依赖)
复制代码
每个引入库, 后面都有一个惟一标记, 用来控制版本, 也就是版本号 + 时间戳 +hash。
若是你对Go也感兴趣, 能够关注个人公众号