go语言的包是没有中央库来统一管理的,通过使用go get命令从远程代码库(github.com,goolge code 等)拉取,直接跳过中央版本库的约束,让代码的拉取直接基于源代码版本控制库,开发者间的协同直接依赖于源代码的版本控制。直接去除了库版本的概念。没有明显的包版本标识,感觉还是有点不适应,官方的建议是把外部依赖的代码全部复制到自己可控的源代码库中,进行统一管理,从而做到对依赖包的可控管理。

1.5版本的vendor目录特性后,官方wiki推荐了多种支持这种特性的包管理工具如:Godep、gv、gvt、glide、Govendor等。下面说明下glide的使用。

glide

glide是Go的包管理工具,用于解决依赖关联。支持语义化版本,支持Git、Svn等,支持Go工具链,支持vendor目录,支持从Godep、GB、GPM、Gom倒入,支持私有的Repos和Forks。官网:https://glide.sh/

使用glide管理的工程目录结构如下:

- $GOPATH/src/myProject (Your project)
|
|-- glide.yaml
|
|-- glide.lock
|
|-- main.go (Your main go code can live here)
|
|-- mySubpackage (You can create your own subpackages, too)
| |
| |-- foo.go
|
|-- vendor
|-- github.com
|
|-- Masterminds
|
|-- ... etc.

glide命令

# 初始化glide配置,扫描源码,生成依赖包文件glide.yaml
glide init # 添加新的包(glide会从代码中解析并导入import包,此外可使用glide get直接下载依赖包)
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

常见问题:

[WARN]  Unable to checkout golang.org/x/crypto
[ERROR] Update failed for golang.org/x/crypto: Cannotdetect VCS
[ERROR] Failed to do initial checkout of config:Cannot detect VCS

由于国外某些网站不能访问,导致许多Golang的依赖包不能通过go get下载,此时需要glide mirror。

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

glide mirror set golang.org/x/crypto github.com/golang/crypto --vcs git

执行上述命令后再执行glide install/glide up即可。

注:glide搜索到的包应该以git或svn等vcs,但上述proxy、websocket和ctxhttp是net的子包,golang.org/x/net/采用git管理。同样,golang.org/x/sys采用git管理,windows是sys的子目录。此时,可在glide.yaml中指定golang.org/x/net和golang.org/x/sys的子包关系:

- package: golang.org/x/net
subpackages:
- proxy
- websocket
- context/ctxhttp
- package: golang.org/x/sys
subpackages:
- windows

此时,直接设置git管理包的镜像即可,mirror设置:

glide mirror set https://golang.org/x/net https://github.com/golang/net --vcs git
glide mirror set golang.org/x/sys https://github.com/golang/sys --vcs git

注:glide mirror的镜像配置写入到$HOME/.glide/mirrors.yaml中。$HOME/.glide/目录下还有一个很重要的目录cache本地 cache,每次更新代码时, glide 都会在本地保存 cache,以备下次 glide install 使用 。

注:github上一般都镜像了golang.org上的大部分源码,可到网站https://github.com/golang/查询。

若glide mirror不起作用,可以直接下载github上的库(glide get),然后软连接cache下的库。

glide get github.com/golang/sys
ln -s https-github.com-golang-sys/ https-golang.org-x-sys

可参考:Goland.org包换国内源 https://www.jianshu.com/p/cefec4cd3a22

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.
repo: git@github.com:Masterminds/vcs
vcs: git
- package: github.com/codegangsta/cli
version: f89effe81c1ece9c5b0fda359ebd9cf65f169a51
- package: github.com/Masterminds/semver
version: ^1.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:在导入中未列出的测试中使用的软件包列表。每个包具有与导入下列出的相同的详细信息。

edgex-go采用glide管理,其glide.yaml文件内容如下:

package: github.com/edgexfoundry/edgex-go
import:
- package: github.com/BurntSushi/toml
- package: github.com/eclipse/paho.mqtt.golang
- package: github.com/go-zoo/bone
- package: github.com/gorilla/mux
- package: github.com/hashicorp/consul
subpackages:
- api
- package: github.com/pebbe/zmq4
- package: github.com/robfig/cron
- package: go.uber.org/zap
- package: gopkg.in/mgo.v2
subpackages:
- bson
- package: gopkg.in/yaml.v2
- package: github.com/mattn/go-xmpp
- package: github.com/satori/go.uuid

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. which is equivalent to >= 1.2, <= 1.4.
2.3. - 4.5 which is equivalent to >= 2.3., <= 4.5
1.2.x is equivalent to >= 1.2., < 1.3. >= 1.2.x is equivalent to >= 1.2.
<= .x is equivalent to <
* is equivalent to >= 0.0. ~1.2. is equivalent to >= 1.2., < 1.3.
~ is equivalent to >= , <
~2.3 is equivalent to >= 2.3, < 2.4
~1.2.x is equivalent to >= 1.2., < 1.3.
~.x is equivalent to >= , < ^1.2. is equivalent to >= 1.2., < 2.0.
^1.2.x is equivalent to >= 1.2., < 2.0.
^2.3 is equivalent to >= 2.3, <
^.x is equivalent to >= 2.0., <

要注意的是安装完成之后,会生成glide.lock文件,锁定安装包的版本,下次再执行 glide install 时,会直接读这个文件下载确定的版本。

参考:

1. Golang包管理工具glide简介

https://www.cnblogs.com/xiwang/p/5870941.html?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

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

https://www.cnblogs.com/CraryPrimitiveMan/p/7828357.html

3. Golang依赖管理工具:glide从入门到精通使用

https://studygolang.com/articles/10453?fr=email

4.Goland.org包换国内源 https://www.jianshu.com/p/cefec4cd3a22

5.edgex-go

6.  edgex0.7.1编译

go包管理之glide的更多相关文章

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

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

  2. Golang包管理工具glide简介

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

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

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

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

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

  5. Go语言包管理工具Glide

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

  6. golang包管理工具glide安装

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

  7. Go 包管理工具--glide

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

  8. golang开发:环境篇(四)包管理器 glide的使用

    glide 是golang项目开发中是特别重要的软件,没有它,golang的项目可能都无法发布. 为什么要使用glide 平时我们开发Go项目的时候,使用第三方的包的时候都直接使用go get 去获取 ...

  9. go包管理工具glide

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

随机推荐

  1. SharePoint 2013 Step by Step—— How to Upload Multiple Documents in Document Library

    How to Upload Multiple documents in SharePoint 2013,Options to add multiple files in a document libr ...

  2. linux 文件系统 xfs、ext4、ext3 的区别

    前言 centos7.0开始默认文件系统是xfs,centos6是ext4,centos5是ext3 ext3介绍 ext3和ext4的最大区别在于,ext3在fsck时需要耗费大量时间(文件越多,时 ...

  3. Python 文件 write() 方法

    概述 Python 文件 write() 方法用于向文件中写入指定字符串. 在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的. 语法 write() 方法语法如 ...

  4. 基于 Transaction 类的分布式显式事务

    自.NET2.0以来增加了System.Transactions命名空间,为.NET应用程序带来了一个新的事务编程模型. 这个命名空间提供了几个依赖的TransactionXXX类.Transacti ...

  5. libsvm参数说明[zz]

    English:libsvm_options:-s svm_type : set type of SVM (default 0) 0 -- C-SVC 1 -- nu-SVC 2 -- one-cla ...

  6. Js字符串与十六进制的相互转换 【转】

    开发过程中,字符串与十六进.二进制之间的相互转换常常会用到,尤其是涉及到中文的加密时,就需要把中文转换为十六进制.下面说说具体的转换方法. 1.字符串转换为十六进制 主要使用 charCodeAt() ...

  7. linux分享二:Linux如何修改字符集

    问题: 当在项目中用到服务器端导出并且查询条件中包含汉字时,总是导出失败,Excel中出现null字样,如何解决方法呢? 解决方法: 把linux的字符集改变一下. 路径:etc/sysconfig/ ...

  8. 如何使Android应用支持多种屏幕分辨率

    原文:http://android.eoe.cn/topic/android_sdk 描述: 让您指定您的应用支持的屏幕的大小并且可以通过屏幕兼容模式来支持比您应用所支持更大的屏幕.所以这对于您需要在 ...

  9. xcode6 怎样下载ios7模拟器

    1. 怎样下载ios7模拟器 点击xcode.选择"Preferences".选择"downloads",就能够看见IOS 7.1,只是下载有点慢. 2. 怎样 ...

  10. 【iOS XMPP】使用XMPPFramewok(五):好友列表

    转自:http://www.cnblogs.com/dyingbleed/archive/2013/05/17/3082226.html 好友列表 好友列表,在 XMPP 中被称为 roster,花名 ...