Golang亦有godep、govendor、glide、gvt、gopack等等
Go 语言原生包管理的缺陷:
能拉取源码的平台很有限,绝大多数依赖的是 github.com
不能区分版本,以至于令开发者以最后一项包名作为版本划分
依赖 列表/关系 无法持久化到本地,需要找出所有依赖包然后一个个 go get
只能依赖本地全局仓库(GOPATH/GOROOT),无法将库放置于局部仓库($PROJECT_HOME/vendor)
Go 提供了原始的 go get ,让第三方包管理可以基于 go get 做扩展。GO15VENDOREXPERIMENT 特性让局部依赖成为现实。Go 官方在给第三方包管理营造条件以及引导开发者用户至所推荐的方向,促进社区的繁荣。证明了一个语言技术的生态不仅仅只能靠官方或者取决于官方的完善程度。
//设置环境变量 使用vendor目录
GO15VENDOREXPERIMENT=1
glide
几大主要功能:
持久化依赖列表至配置文件中,包括依赖版本(支持范围限定)以及私人仓库等
持久化关系树至 lock 文件中(类似于 yarn 和 cargo),以重复拉取相同版本依赖
兼容 go get 所支持的版本控制系统:Git, Bzr, HG, and SVN
支持 GO15VENDOREXPERIMENT 特性,使得不同项目可以依赖相同项目的不同版本
可以导入其他工具配置,例如: Godep, GPM, Gom, and GB
安装glide
$ go get github.com/Masterminds/glide
$ go install github.com/Masterminds/glide
初始化 (glide init)
glide.yaml记载了依赖包的列表及其更新规则,每次执行 glide up 时,都会按照指定的规则(如只下载补丁(patch)不下载升级(minor))下载新版。
安装依赖 (glide install)
$ glide mirror set golang.org/x/crypto github.com/golang/crypto
glide.yml是 glide 包管理的配置文件
这些元素是:
package:顶部的 package 是它所在GOPATH的位置,glide 将从该位置下开始导包。
homepage:该项目的详情页面。
license:许可证标识,可以是SPDX license字符串或文件路径。
owners:项目的所有者信息,便于接受漏洞信息。
ignore:忽略导入的包,注意是包而不是目录。
excludeDirs:排除扫描依赖的目录。
import:import 的包列表:
package:导入包的名称,必填。软件包名称遵循go工具所用的相同模式。这意味着:1、映射到VCS远程位置的软件包名称以.git,.bzr,.hg或.svn结尾。 例如,example.com/foo/pkg.git/subpkg。2、GitHub, BitBucket, Launchpad, IBM Bluemix Services, and Go on Google Source是特殊情况,不需要 VCS 扩展。
version:可以为semantic version, semantic version range, branch, tag 或者 commit id。
repo:如果包名称不是repo位置或这是一个私人存储库,它可以去这里。 该软件包将从repo签出并放在软件包名称指定的位置。 这允许使用fork。
vcs:要使用的VCS,如git,hg,bzr或svn。仅当无法从名称中检测到类型时才需要。例如,以.git或GitHub结尾的仓库可以被检测为Git。 对于Bitbucket的repo,我们可以联系API来发现类型。
subpackages:在存储库中使用的包的记录。这不包括存储库中的所有包,而是包括正在使用的包。
os:用于过滤的操作系统的列表。如果设置它将比较当前运行时操作系统与指定的操作系统,并且只有获取匹配的依赖。如果未设置过滤,则跳过。这些名称与构建标志和GOOS环境变量中使用的名称相同。
arch:用于过滤的体系结构列表。如果设置它将比较当前运行时架构与指定的架构,并且只有在匹配时获取依赖关系。如果未设置过滤,则跳过。名称与构建标志和GOARCH环境变量中使用的名称相同。
testImport:在导入中未列出的测试中使用的软件包列表。每个包具有与导入下列出的相同的详细信息。
导入开发分支:
1,更新package,修改glide.yaml 中的version为分支名或者commitid
import:
增加镜像
vi ~/.glide/mirrors.yaml