上一篇文章中我们已经成功的运行了go的代码,这是我们迈出的最基础的一步。

一个项目通常会依赖很多外部的库,当依赖的库比较多的时候,手工管理就会比较麻烦,这个时候就需要包管理工具出场了,帮你管理好所有依赖的库。

php项目中使用composer,javascript项目中使用npm,那么在go项目中,我们需要使用什么?

包依赖工具的选择

当前go的包管理工具有glidegodepgovendorgvt等,相关对比的文章可以查看《go依赖包管理工具对比》

功能对比可以参考如下内容(虽然跟上面文章比较的工具有些不同),内容来自《Go Package Manager Comparison》

  Glide GB Godep Govendor
Semantic Versions
Semantic Version Ranges
Resolves dependency trees including versions
Uses common range syntax (similar to PHP, JavaScript, etc)
Tries to import from other package managers
Copies from the GOPATH ✕*
Works with the go toolchain
Locks for reproducible builds
Allows package/version checked into VCS or installed on demand
Aliased repos (e.g., using forks)
Plugin extensibility model
Supports deleting unused repos for cleanup (opt-in)

根据我们的需求和了解,选择了使用glide,当然大家也可以选择其他包管理工具。

现在官方也出了包管理工具dep,感兴趣的可以查看这篇文章《官方依赖管理工具:dep》

为什么我们不选择dep,而使用glide,有以下两点原因:

  1. 我们需要支持VCS,dep暂时不支持
  2. dep需要翻墙

当然如果这两点对你来说不是问题的话,我也推荐大家使用dep

glide命令

我们来熟悉一下glide的命令

# 初始化glide配置
glide create
glide init # 添加新的包
glide get [package name] # 根据glide.yaml更新包
glide update
glide up # 根据glide.yaml安装包
glide install # 返回当前项目的名称
glide name # 列出当前项目已安装的包
glide list # 替换包的镜像
glide mirror set [original] [replacement]
glide mirror set [original] [replacement] --vcs [type] # 移除包的镜像
glide mirror remove [original] # 获取包的镜像列表
glide mirror list

glide mirror特别适用于不能访问一些站点,导致很Golang的依赖包不能通过go get下载的情况。可以通过配置将墙了的版本库 URL 映射到没被墙的 URL,甚至也可以映射到本地版本库。

掌握上面的命令就可以使用glide了,是不是很简单?

glide.yaml解析

我们再来看一一个完整的glide.yaml的内容

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

glide.yaml中的这些元素的解释如下:

  • 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:在导入中未列出的测试中使用的软件包列表。每个包具有与导入下列出的相同的详细信息。

glide版本号指定规则如下:

=: equal (aliased to no operator)
!=: not equal
>: greater than
<: less than
>=: greater than or equal to
<=: less than or equal to 1.2 - 1.4.5 which is equivalent to >= 1.2, <= 1.4.5
2.3.4 - 4.5 which is equivalent to >= 2.3.4, <= 4.5
1.2.x is equivalent to >= 1.2.0, < 1.3.0 >= 1.2.x is equivalent to >= 1.2.0
<= 2.x is equivalent to < 3
* is equivalent to >= 0.0.0 ~1.2.3 is equivalent to >= 1.2.3, < 1.3.0
~1 is equivalent to >= 1, < 2
~2.3 is equivalent to >= 2.3, < 2.4
~1.2.x is equivalent to >= 1.2.0, < 1.3.0
~1.x is equivalent to >= 1, < 2 ^1.2.3 is equivalent to >= 1.2.3, < 2.0.0
^1.2.x is equivalent to >= 1.2.0, < 2.0.0
^2.3 is equivalent to >= 2.3, < 3
^2.x is equivalent to >= 2.0.0, < 3

要注意的是安装完成之后,会生成glide.lock文件,锁定安装包的版本。

代码可参考:https://github.com/CraryPrimitiveMan/go-in-action/tree/master/ch2

参考摘录文章

glide包管理工具的更多相关文章

  1. [golang] Glide 包管理工具,在windows10 64位系统上的bug修复方案

    bug重现 [ERROR] Unable to export dependencies to vendor directory: Error moving files: exit status 1. ...

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

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

  3. Golang包管理工具glide简介

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

  4. Go语言包管理工具Glide

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

  5. go包管理工具glide使用方法

    golang没有官方最佳管理方案,在go的世界里存在大量的自制解决方案. go语言的包是没有中央库统一管理的,通过使用go get命令从远程代码库(github.com,goolge code 等)拉 ...

  6. golang包管理工具及环境管理工具;如何下载外网的依赖包

    简介: golang的包管理工具类似于java的maven.python的pip.js的npm,可以实现依赖包的统一管理:有很多:govendor.godep.glide,挑一个自己喜欢的用吧.mac ...

  7. Go的包管理工具(一)

    在前面转载了系列文章:Golang 需要避免踩的 50 个坑,总得来说阅读量都挺大.今天这篇文章,咱们一起聊聊Go的依赖包管理工具. 背景 每一门语言都有其依赖的生态,当我们使用Java语言的时候,使 ...

  8. Python黑帽编程1.3 Python运行时与包管理工具

    Python黑帽编程1.3  Python运行时与包管理工具 0.1  本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks Attack and ...

  9. 包管理工具Carthage使用

    iOS项目中第三方开源库的工具有Cocoapods和Carthage,swift官方出了一个包管理工具SPM(Swift Package Manager). 首先,大体讲一下Cocoapods和Car ...

随机推荐

  1. Python 多版本管理利器 pythonbrew

    在$HOME目录中管理python安装 简介 pythonbrew是受 perlbrew 和 rvm 启发,在用户的$HOME目录中进行python构建和安装自动化的项目. 另一衍生版本 : pyth ...

  2. TCP/IP分层图解

    网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能.一个协议族,比如 T C P / I P,是一组不同层次上的多个协议的组合. T C P / I P通常被认为是一个四层协议系统,如图1 ...

  3. investigate issues of real time interrupted

    Issues: customer report that real time will interrupted frequently as below: Root Cause: some storm ...

  4. 利用XtraBackup给MYSQL热备(基于数据文件)

    利用XtraBackup给MYSQL热备(基于数据文件) By JRoBot on 2013 年 11 月 26 日 | Leave a response 利用XtraBackup给MYSQL热备(基 ...

  5. paramiko多线程远程执行命令

    import paramiko import sys import getpass import threading import os def rcmd(host=None, port=22, us ...

  6. python中闭包的概念

    闭包:简单来说,就是一个外部函数的返回值是内部函数的引用 通过一个例子来说明 def outer(a): b = 10 def inner(): print(a+b) return inner   # ...

  7. jQuery.proxy(function,context)

    jQuery.proxy(function,context) 概述 jQuery 1.4 新增.返回一个新函数,并且这个函数始终保持了特定的作用域.大理石平台检定规程 当有事件处理函数要附加到元素上, ...

  8. https 非对称加密

  9. 数据结构实验之二叉树五:层序遍历 (SDUT 3344)

    #include <bits/stdc++.h> using namespace std; struct node { char data; struct node *lc, *rc; } ...

  10. csp-s模拟109

    这场考试状态是极差,也因而无畏地打下了三个乱搞.然而这场确实挺乱搞.T1状压但我没优化而选择循环展开,T2打$bitset$随机化(考场上打的有问题不是随机但也能A),T3贪心骗分.但是因为状态实在太 ...