Skip to content

Latest commit

 

History

History
127 lines (97 loc) · 5.06 KB

包管理工具.md

File metadata and controls

127 lines (97 loc) · 5.06 KB

golang 包管理工具

Go语言程序组织和构建的基本单元是Package,但Go语言官方却没有提供一款“像样的”Package Management Tool(包管理工具)。 随着Go语言在全球范围内应用的愈加广泛,缺少官方包管理工具这一问题变得日益突出。

2016年GopherCon大会后,在Go官方的组织下,一个旨在改善Go包管理的commitee成立了,共同应对Go在package management上遇到的各种问题。 经过各种脑洞和讨论后,该commitee在若干月后发布了“Package Management Proposal”, 并启动了最有可能被接纳为官方包管理工具的项目dep的设计和开发。2017年年初,dep项目正式对外开放。截至目前,dep发布了v0.1.0版本,并处于alpha测试阶段。

glide

使用之前,首先安装 glide 参考 glide 官网

  • glide create|init 初始化项目并创建glide.yaml文件.
  • glide get 获取单个包   --all-dependencies 会下载所有关联的依赖包   -s 删除所有版本控制,如.git   -v 删除嵌套的vendor
  • glide install 安装包
  • glide update|up 更新包

glide采用 glide.yaml 和 glide.lock 进行版本控制,所有的包管理都在 vendor目录下。 glide.lock文件是自己生成的,不要动。 如果只需要引用项目的其中一部分或者是项目的某一个版本,在glide.yaml文件下修改。

package: glide_demo6
    import:
    - package: github.com/mattn/go-adodb
    - package: github.com/go-ole/go-ole

当配置好如上文件之后, 执行 glide install 即可获取。

dep

  • 第三方依赖管理很多,虽然很好用,但是很少可以兼容的,结果--乱;
  • dep 是官方推荐的 go 包管理工具,在 tidb 项目中使用过,推荐使用。与glide 有异曲同工之妙。
  • 概括: 依赖管理工具是为应用管理代码的,go get是为 GOPATH 管理代码的

安装

  • 环境准备 设置环境变量 使用vendor目录GO15VENDOREXPERIMENT=1
  • 安装 dep $ go get -u github.com/golang/dep/cmd/dep 目前为止需要手动安装。1.10 之后可能直接使用 go dep
  • 验证安装
$ dep
dep is a tool for managing dependencies for Go projectsUsage: dep <command>Commands:  init    Initialize a new project with manifest and lock files
  status  Report the status of the project‘s dependencies
  ensure  Ensure a dependency is safely vendored in the project
  prune   Prune the vendor tree of unused packagesExamples:
  dep init                               set up a new project
  dep ensure                             install the project‘s dependencies
  dep ensure -update                     update the locked versions of all dependencies
  dep ensure -add github.com/pkg/errors  add a dependency to the projectUse "dep help [command]" for more information about a command.

使用

** 先进入在 GOPATH 的一个项目中。** cd $GOPATH/src/testGo

  • 初始化(dep init) 应用 testGo 目录下出现了两个文件(Gopkg.lock、Gopkg.toml)和一个目录(vendor)

注意:当出现 Gopkg.toml and Gopkg.lock are out of sync.时候最好执行一下 dep ensure

  • Gopkg.toml
# 必需包required = ["github.com/astaxie/beego"]# 忽略包ignored = ["golang.org/x/crypto"]# 项目元数据[metadata]
homepage = "https://github.com/qiangmzsx"license = "MIT"owners_name_1 = "qiangmzsx"owners_email_1 = "[email protected]"owners_homepage_1 = "https://github.com/qiangmzsx"# 约束条件[[constraint]]
  name = "github.com/astaxie/beego"
  # 可选:版本
  version = "=1.8.0"
  # 分支
  #branch = "master"
  # 修订
  #revision = "beego 1.8.0"
  # 可选:指定来源
  source = "github.com/astaxie/beego"
  • 还可以指定依赖的版本:

$ dep ensure -add github.com/bitly/go-simplejson@=0.4.3

预警: 假设发现 Gopkg.toml和 Gopkg.lock 不同步了,需要重新执行一下 dep ensure 即可

  • 当执行 dep ensure 时候出错,说明配置写错了,需要看看Gopkg.toml文件中是不是同时配置了version、branch和revision。

  • 执行dep ensure 为了更好地看到过程,加上参数-v。

  • dep会自动根据代码生成Gopkg.toml和Gopkg.lock配置文件。

PS:但是不建议使用,因为其拉取的依赖包都是最新的,可能出现不兼容,再者我国是一个被墙的地方。
  • dep cache

dep也是有本地缓存的,大家可以打开 $GOPATH/pkg/dep/ 看看

好处有两个

  • 节省时间;

  • 本地类库的稳定性和兼容性已经经过用户验证了。

  • 更新配置 (dep ensure -update)

最后附一个在 tidb 时 fix 这个问题的 makefile

update:
   	which dep 2>/dev/null || go get -u github.com/golang/dep/cmd/dep
   ifdef PKG
   	dep ensure -add ${PKG}
   else
   	dep ensure -update
   endif
   	@echo "removing test files"
   	dep prune
   	bash ./hack/clean_vendor.sh

glide 也好 dep 也罢,掌握他们吧主要是学会写他们对应的版本管理文件。

dep 属于go官方亲生,所以个人建议使用 dep 更为稳妥一点,这一点采纳tidb 内部最后将 glide 替换为 dep 的做法。