go包管理之glide

摘要:
官方建议是将所有依赖外部的代码复制到您控制的源代码库中。官方wiki推荐了多种支持此功能的包管理工具,例如:生成依赖包文件glide。yamlglidinit#添加新包(glide将解析并从代码中导入导入包)。

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

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.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文件,锁定安装包的版本,下次再执行 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》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android应用开发基础篇(8)-----SurfaceView新手入门贴:史上最全Web端即时通讯技术原理详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SAP-ABAP程序开发规范

SAP--ABAP程序开发规范 1  范围 本标准规定了SAP S/4 系统程序开发过程中术语定义、命名规则、程序结构、测试方法和请求管理。 本标准适用于SAP S/4 系统的ABAP语言开发的程序。 2  规范性引用文件 下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅所注日期的版本适用于本文件。凡是不注日期的引用文件,其最新版本(包括所有...

java生成UUID通用唯一识别码

一、UUID概述 UUID含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份。 UUID 的目...

ICE第三方包简介及安装&amp;amp;ICE安装(linux)

1、下载第三方包ThirdParty-Sources-3.3.0.tar.gz http://www.zeroc.com/download/Ice/3.3/ThirdParty-Sources-3.3.0.tar.gz    解压:tar xzvf ThirdParty-Sources-3.3.0.tar.gz 2、安装及简介 1)mcpp  is a C...

SVN在Windows下安装

SVN在Windows下安装 一、准备工作: 1、 Http服务器:apache2.X  官方网站为http://httpd.apache.org/ 2、 Svn:官方网站为http://subversion.tigris.org/ 3、 客户端程序(可选):TortoiseSVN(如果想用此工具建库,要注意版本应该是SVN服务器支持的版本)二、安装: 1...

在VS2010中创建网站并发布

1、打开VS2010,进入VS2010起始页 2、在菜单栏中选择:文件——新建——网站 3、在弹出的新建网站中选择“ASP.NET 网站”或“ASP.NET 空网站”,在左上角的“已安装模板”中可以选择你要使用的编程语言,其中有VB和C#,选择网站的保存位置并确定网站名称,点击确定按钮。 4、若选择的网站是“ASP.NET 网站”,则会以系统中存在的...

Go语言学习--包

包 包是多个Go源码的集合,是一种高级的代码复用方案。 Go语言中提供了很多内置包,例如fmt,os,io等... 包的定义 我们可以创建自己需要的包。 一个包可以理解为是一个存放.go文件的文件夹 go文件都需要在代码的第一行添加“ package 包名 ”代码,声明该文件归属的包。注: 一个文件夹下面直接包含的文件只能归属一个package,同样一个...