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管理的工程目录结构如下:

  1. - $GOPATH/src/myProject (Your project)
  2. |
  3. |-- glide.yaml
  4. |
  5. |-- glide.lock
  6. |
  7. |-- main.go (Your main go code can live here)
  8. |
  9. |-- mySubpackage (You can create your own subpackages, too)
  10. | |
  11. | |-- foo.go
  12. |
  13. |-- vendor
  14. |-- github.com
  15. |
  16. |-- Masterminds
  17. |
  18. |-- ... etc.

glide命令

  1. # 初始化glide配置,扫描源码,生成依赖包文件glide.yaml
  2. glide init
  3.  
  4. # 添加新的包(glide会从代码中解析并导入import包,此外可使用glide get直接下载依赖包)
  5. glide get [package name]
  6.  
  7. # 根据glide.yaml更新包(包新版源码)
  8. glide update
  9. glide up
  10.  
  11. # 根据glide.yaml安装包
  12. glide install
  13.  
  14. # 返回当前项目的名称
  15. glide name
  16.  
  17. # 列出当前项目已安装的包
  18. glide list
  19.  
  20. # 替换包的镜像
  21. glide mirror set [original] [replacement]
  22. glide mirror set [original] [replacement] --vcs [type]
  23.  
  24. # 移除包的镜像
  25. glide mirror remove [original]
  26.  
  27. # 获取包的镜像列表
  28. glide mirror list

常见问题:

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

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

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

  1. 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的子包关系:

  1. - package: golang.org/x/net
  2. subpackages:
  3. - proxy
  4. - websocket
  5. - context/ctxhttp
  6. - package: golang.org/x/sys
  7. subpackages:
  8. - windows

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

  1. glide mirror set https://golang.org/x/net https://github.com/golang/net --vcs git
  2. 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下的库。

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

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

glide.yaml解析

glide.yaml包含工程和依赖包信息,如下:

  1. package: github.com/Masterminds/glide
  2. homepage: https://masterminds.github.io/glide
  3. license: MIT
  4. owners:
  5. - name: Matt Butcher
  6. email: technosophos@gmail.com
  7. homepage: http://technosophos.com
  8. - name: Matt Farina
  9. email: matt@mattfarina.com
  10. homepage: https://www.mattfarina.com
  11. ignore:
  12. - appengine
  13. excludeDirs:
  14. - node_modules
  15. import:
  16. - package: gopkg.in/yaml.v2
  17. - package: github.com/Masterminds/vcs
  18. version: ^1.2.
  19. repo: git@github.com:Masterminds/vcs
  20. vcs: git
  21. - package: github.com/codegangsta/cli
  22. version: f89effe81c1ece9c5b0fda359ebd9cf65f169a51
  23. - package: github.com/Masterminds/semver
  24. version: ^1.0.
  25. # 测试导入包
  26. testImport:
  27. - 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文件内容如下:

  1. package: github.com/edgexfoundry/edgex-go
  2. import:
  3. - package: github.com/BurntSushi/toml
  4. - package: github.com/eclipse/paho.mqtt.golang
  5. - package: github.com/go-zoo/bone
  6. - package: github.com/gorilla/mux
  7. - package: github.com/hashicorp/consul
  8. subpackages:
  9. - api
  10. - package: github.com/pebbe/zmq4
  11. - package: github.com/robfig/cron
  12. - package: go.uber.org/zap
  13. - package: gopkg.in/mgo.v2
  14. subpackages:
  15. - bson
  16. - package: gopkg.in/yaml.v2
  17. - package: github.com/mattn/go-xmpp
  18. - package: github.com/satori/go.uuid

glide版本号指定规则如下:

  1. =: equal (aliased to no operator)
  2. !=: not equal
  3. >: greater than
  4. <: less than
  5. >=: greater than or equal to
  6. <=: less than or equal to
  7.  
  8. 1.2 - 1.4. which is equivalent to >= 1.2, <= 1.4.
  9. 2.3. - 4.5 which is equivalent to >= 2.3., <= 4.5
  10. 1.2.x is equivalent to >= 1.2., < 1.3.
  11.  
  12. >= 1.2.x is equivalent to >= 1.2.
  13. <= .x is equivalent to <
  14. * is equivalent to >= 0.0.
  15.  
  16. ~1.2. is equivalent to >= 1.2., < 1.3.
  17. ~ is equivalent to >= , <
  18. ~2.3 is equivalent to >= 2.3, < 2.4
  19. ~1.2.x is equivalent to >= 1.2., < 1.3.
  20. ~.x is equivalent to >= , <
  21.  
  22. ^1.2. is equivalent to >= 1.2., < 2.0.
  23. ^1.2.x is equivalent to >= 1.2., < 2.0.
  24. ^2.3 is equivalent to >= 2.3, <
  25. ^.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. excel中对数据进行分类求和

    我们在用excel处理数据时,常常需要按不同的类别分别汇总数据.例如下图中需要求出每个业务员的总销售金额等. 通常情况下我们的数据量很大,而且需要较快的统计出来结果,所以我们要用一定的技巧才能计算出来 ...

  2. How to convert String to Date – Java

    In this tutorial, we will show you how to convert a String to java.util.Date. Many Java beginners ar ...

  3. python标准库介绍——36 popen2 模块详解

    ==popen2 模块== ``popen2`` 模块允许你执行外部命令, 并通过流来分别访问它的 ``stdin`` 和 ``stdout`` ( 可能还有 ``stderr`` ). 在 pyth ...

  4. JPA之@GeneratedValue注解(转)

    JPA的@GeneratedValue注解,在JPA中,@GeneratedValue注解存在的意义主要就是为一个实体生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键), ...

  5. Java 打印程序设计实例

    3.1 打印文本 3.1.1 应用场景 假设我们需要打印一个窗体的某个文本编辑域(可能只有几行,也可能包含多页)的内容,并且每页最多打印 54 行,如何实现呢? 3.1.2 解决方法 基本思路如下:首 ...

  6. 解决ssh连接慢(有时候等半分钟才出现密码输入提示)的方法

    经常通过ssh 或者 scp 连接一堆远程主机,同样是 Linux 主机,其中一些创建 ssh 连接速度特别慢,连接建立之后执行操作速度却很正常,看来应该不是网络原因.解决的方法是通过ssh 的-v参 ...

  7. InlineModelAdmin对象的学习

    一.InlineModelAdmin的介绍 管理界面可以在与父模型相同的页面上编辑模型.这些被称为内联. Django提供了两个子类,InlineModelAdmin它们是: TabularInlin ...

  8. 【Unity】第9章 粒子系统

    分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 粒子是在三维空间中渲染出来的二维图像,主要用于在场景中表现如烟.火.水滴.落叶.--等各种效果. Unity粒子系统 ( ...

  9. pc客户端网页录音和压缩

    web录音的功能,也就是怎么使用 getUserMedia 音频上传 栗子中最后返回的是Blob数据 return new Blob([dataview], { type: type }) 因为对ht ...

  10. Webbench是有名的网站压力测试工具

    [root@666 webbench-1.5]# yum install ctags [root@666 webbench-1.5]#make && make install inst ...