golang没有官方最佳管理方案,在go的世界里存在大量的自制解决方案。

go语言的包是没有中央库统一管理的,通过使用go get命令从远程代码库(github.com,goolge code 等)拉取,直接跳过中央版本库的约束,让代码的拉取直接基于源代码版本控制库开发者间的协同直接依赖于源代码的版本控制。

这就直接去除了库版本的概念。没有明显的包版本标识,官方的建议是把外部依赖的代码全部复制到自己可控的源代码库中,进行统一管理,从而做到对依赖包的可控管理。

下面是一些推荐的版本管理工具:

版本管理工具

1.5版本的vendor目录特性后,官方wiki推荐了多种支持这种特性的包管理工具如:

  • godep
  • gv
  • gvt
  • glide
  • govendor

我们在这里推荐使用glide

glide简介

glide(官网)是一个golang项目的包管理工具,非常方便快捷,一般只需要2-3个命令就可以将go依赖包自动下载并

归档到vendor的目录中。

安装

下面提供了几种安装途径:

  • 1.命令行安装
curl https://glide.sh/get | sh
  • 2.下载release
https://github.com/Masterminds/glide/releases
  • 3.使用brew安装
brew install glide
  • 4.使用go get安装(推荐方法)
go get -u github.com/Masterminds/glide

使用

1 侦测项目依赖

#进入到项目目录
> cd $GOPATH/src/demo
#glide初始化,初始化配置文件glide.yaml
> glide init

运行上面的命令后,会生成配置文件glide.yaml,其中包含了依赖库的信息,比如版本号,大致格式如下:

package: github.com/MangoDowner/archive
import:
- package: github.com/astaxie/beego
version: v1.11.1
- package: github.com/fsnotify/fsnotify
version: v1.4.7

运行过程中还可能出现一些交互信息,咨询依赖版本之类的,比如

[INFO]  Here are some suggestions...
[INFO] The package github.com/astaxie/beego appears to have Semantic Version releases (http://semver.org).
[INFO] The latest release is v1.11.1. You are currently not using a release. Would you like
[INFO] to use this release? Yes (Y) or No (N)

2 更新项目依赖

# glide加载依赖包,自动归档到vendor目录
glide up -v

glide 会生成一个glide.lock文件,该文件包含了完整的依赖树信息.

**注意: 此处不包括此文件的详细信息,因为不应手动编辑此文件。 **

为什么这里会有一个 -v?

--strip-vendor 或者 -v标识都是为了解决下面的问题.

3. 扁平化依赖关系

glide将所有的依赖关系都迁入项目的顶级vendor文件夹中,原因有二:

  • 1.所有引入位置都会编译进可执行文件.如果同样的依赖被三个vendor目录引入,

    就要变异三次.这会导致编译文件变得臃肿.
  • 2.同样依赖包,如果在不同的位置,就会生成不同的变量实例.即使他们有着相同的版本.

    go把他们看成是不同的包,因为他们在不同的位置.

    这对于数据库驱动/日志等其他东西来说都是个大问题.

比如下面的依赖:

- $GOPATH/src/github.com/mattfarina/golang-broken-vendor
- foo.go
- vendor/
- a/
- b/
- vendor/a/

这样的代码就不能运行

func main() {
var it a.A
it = "foo" b.Do(it)
}

报错信息:

$ GO15VENDOREXPERIMENT=1 go build
./foo.go:12: cannot use it
(type "github.com/mattfarina/golang-broken-vendor/vendor/a".A) as type
"github.com/mattfarina/golang-broken-vendor/vendor/b/vendor/a".
A in argument to b.Do

参照:How To Break Build With Go Vendor Experiment

3 增加项目依赖

可以使用get命令

> glide get github.com/Masterminds/semver

也可以带上版本

> glide get github.com/Masterminds/semver#~1.2.0

#用来隔离依赖名称和版本号.

get命令和go get类似,只是前者将依赖拉入vendor目录,

而后者拉入GOPATH相应目录.

配置文件

配置文件包含了项目的信息还有依赖包

package: github.com/Masterminds/glide
homepage: https://masterminds.github.io/glide
license: MIT
owners:
- name: Matt Butcher
email: technosophos@gmail.com
homepage: http://technosophos.com
- name: Matt Farina
email: matt@mattfarina.com
homepage: https://www.mattfarina.com
ignore:
- appengine
excludeDirs:
- node_modules
import:
- package: gopkg.in/yaml.v2
- package: github.com/Masterminds/vcs
version: ^1.2.0
repo: git@github.com:Masterminds/vcs
vcs: git
- package: github.com/codegangsta/cli
version: f89effe81c1ece9c5b0fda359ebd9cf65f169a51
- package: github.com/Masterminds/semver
version: ^1.0.0
testImport:
- package: github.com/arschles/assert
  • package: GOPATH位置下的顶层包.者用来确保不会在顶层包级再次引入.
  • homepage: 一般用来指明查看包或者和应用更多内容的地方.比如说, http://k8s.io
  • owners: 项目所有人的列表.可以用来联系所有人
  • ignore: 用来让glide忽略引入.一般是包名而不是目录名.
  • excludeDirs: 要从依赖项扫描中排除的本地代码库目录列表。
  • import: 要引入的包列表,包括:
    • package: 要引入的包名,而且是为唯一的必填项.包名和go tool引入的规则一样. 也就是说:

      • 包名映射到远程的VCS地址,比如.git, .bzr, .hg, 或者.svn.比如example.com/foo/pkg.git/subpkg
      • GitHub, BitBucket, Launchpad, IBM Bluemix Services还有 Go on Google Source是特殊情形,不需要vcs后缀.
    • version: 语义版本/语义版本范围/分支/tag或提交id,都可以使用
    • repo: 如果包名不是包的位置,或者属于私有库.这可以从repo指定的位置拉取代码并放入包名指定的位置里面去.

    这样就可以支持fork,而且可以解决golang.org代码被墙的问题.

    • vcs:可以使用的VCS,比如说 git, hg, bzr, 或者 svn. 只有无法从名称侦测到类型的时候才需要.
    • subpackages: 仓库中被使用的包的记录,也就是说不包括那些没被使用的包.
    • os: 操作系统列表.如果设置了,它会将当前runtime操作系统与指定的操作系统进行比较,只在存在匹配项时获取依赖项.

      名称和go build以及GOOS环境变量中使用的相同
  • testImport:在tests中使用,并且未在import中列出包列表.他们和import下面列出的包有着相同的细节.

下面提供一些常用的命令:

常用命令

glide create (别名init)

初始化新的workspace,还会创建glide.yaml文件,同时尝试猜测要放入其中的包和版本。

如果您的项目正在使用godep,它将使用那里指定的版本。

glide很智能,可以扫描代码库并检测正在使用的导入,无论它们是否与其他包管理器一起指定。

glide get [包名]

你可以使用该指令来将包下载到你的vendor目录下,glide还会将包放入你的glide.yaml文件中去.

$ glide get github.com/Masterminds/cookoo

glide update (别名up)

下载glide.yaml文件中列出的所有库,并将他们放到vendor目录下.

如果要解决前文所说的那个多次引入vendor目录,请使用-v标志,即:

glide update -v

glide install

如果你想要安装glide.lock中指定的版本:

$ glide install

glide novendor (别名nv)

当你运行go test的时候,比如go test ./...时,go会把你依赖库的test也进行一遍,这不是我们想要的.

这时候就可以使用该命令,只对项目本身的tests进行处理.

go test $(glide novendor)

glide list

这个命令会按序列出项目引入的所有包:

$ glide list
INSTALLED packages:
vendor/github.com/Masterminds/cookoo
vendor/github.com/Masterminds/cookoo/fmt
vendor/github.com/Masterminds/cookoo/io
vendor/github.com/Masterminds/cookoo/web
vendor/github.com/Masterminds/semver
vendor/github.com/Masterminds/vcs
vendor/github.com/codegangsta/cli
vendor/gopkg.in/yaml.v2

glide mirror

镜像用原始镜像的另一个位置替换仓库位置力。

如果希望为持续集成(CI)系统加入缓存,或者希望在本地位置处理依赖项时,这就很有用了。

镜像存储在你的GLIDE_HOME目录的mirrors.yaml目录里

其包含的三个自命令为list, set, 还有 remove.

set命令:

glide mirror set [original] [replacement]
# 或者
glide mirror set [original] [replacement] --vcs [type]

比如说:

glide mirror set https://github.com/example/foo https://git.example.com/example/foo.git
# 又或者
glide mirror set https://github.com/example/foo file:///path/to/local/repo --vcs git

remove命令:

glide mirror remove [original]

比如说:

glide mirror remove https://github.com/example/foo

参考文章:

Golang包管理工具glide简介

Glide: Vendor Package Management for Go

go包管理工具glide使用方法的更多相关文章

  1. Golang学习--包管理工具glide

    上一篇文章中我们已经成功的运行了go的代码,这是我们迈出的最基础的一步. 一个项目通常会依赖很多外部的库,当依赖的库比较多的时候,手工管理就会比较麻烦,这个时候就需要包管理工具出场了,帮你管理好所有依 ...

  2. Golang包管理工具glide简介

    Golang包管理工具glide简介 前言 Golang是一个十分有趣,简洁而有力的开发语言,用来开发并发/并行程序是一件很愉快的事情.在这里我感受到了其中一些好处: 没有少了许多代码格式风格的争论, ...

  3. Go语言包管理工具Glide

      Go语言包管理工具用于管理Go项目的库和库的依赖引用. 包管理工具普遍会在Go项目根目录生成Vendor文件夹并自动下载该Go项目需要的库. Go语言有很多开源的包管理工具,这里主要介绍Glide ...

  4. Golang Vendor 包管理工具 glide 使用教程

    Glide 是 Golang 的 Vendor 包管理器,方便你管理 vendor 和 verdor 包.类似 Java 的 Maven,PHP 的 Composer. Github:https:// ...

  5. golang包管理工具glide安装

    1:下载安装glide go get github.com/Masterminds/glide glide的源码以及exe文件在第一个gopath目录,如果不知道哪个是第一个gopath,echo一下 ...

  6. Go 包管理工具--glide

    网上有一篇解释glide比较好的文章:https://my.oschina.net/u/553243/blog/1475626 在命令行中输入glide $glide NAME: glide - Ve ...

  7. go包管理工具glide

    一.命令 安装 $ go get github.com/Masterminds/glide $ go install github.com/Masterminds/glide 初始化项目并在当前项目下 ...

  8. glide包管理工具

    上一篇文章中我们已经成功的运行了go的代码,这是我们迈出的最基础的一步. 一个项目通常会依赖很多外部的库,当依赖的库比较多的时候,手工管理就会比较麻烦,这个时候就需要包管理工具出场了,帮你管理好所有依 ...

  9. go包管理之glide

    go语言的包是没有中央库来统一管理的,通过使用go get命令从远程代码库(github.com,goolge code 等)拉取,直接跳过中央版本库的约束,让代码的拉取直接基于源代码版本控制库,开发 ...

随机推荐

  1. LDA相关论文汇总

    转:http://blog.csdn.net/pirage/article/details/9467547 LDA理论 David M. Blei, Andrew Y. Ng, and Michael ...

  2. TypeScript----类

    一.类的属性 public: 公有, private: 私有,不能在声明它的类的外部访问,只能在类内部访问 protect: 保护,不能在声明它的类的外部访问,但继承者除外 readonly 只读属性 ...

  3. servlet的使用

    Servlet是比较基础的的客户端与服务器数据交互程序,通过HttpServletRequest请求和HttpServletResponse响应,可以基本实现web程序开发. 1.Servlet基础代 ...

  4. bzoj2816 [ZJOI2012]网络

    Description http://www.lydsy.com/JudgeOnline/upload/zjoi2012.pdf 正解:$link-cut \ tree$. $LCT$板子题,直接维护 ...

  5. UVA151 Power Crisis

    嘟嘟嘟 这道题被评为紫题完全是在假(虽然我也跟风评了紫题),顶多黄题难度. 评黄题的主要原因是得知道约瑟夫递推公式,即fn = (fn - 1 +m) % n.表示n个人报数最后的获胜者,需要注意的是 ...

  6. 小BAT解决大麻烦_某卡教室控制软件

    @echo off mode con cols= lines= if "%1" == "h" goto begin mshta vbscript:)(windo ...

  7. 全局ajax的使用

    一.ajax介绍 详细介绍请看:http://www.runoob.com/ajax/ajax-tutorial.html AJAX = Asynchronous JavaScript and XML ...

  8. Sublime Text 3 for Mac 3176 序号版

    —– BEGIN LICENSE —–sgbteamSingle User LicenseEA7E-11532598891CBB9 F1513E4F 1A3405C1 A865D53F115F202E ...

  9. C#处理List<object>重复数据的问题

    private class ListDistinct : IEqualityComparer<object> { public bool Equals(object x, object y ...

  10. 使用腾讯云mysql的一下小坑

    1. 数据库中标的命名,mybatis会给你全部转成驼峰命名,这样就会发现找不到数据库的表了.比如下面的,我在本地运行时ok, 表名称是t_blogtype,但是放到服务器就报错说找不到表. 2. 本 ...