go包管理之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

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

注: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: [email protected]
  homepage: http://technosophos.com
- name: Matt Farina
  email: [email protected]
  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:    [email protected]: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

原文地址:https://www.cnblogs.com/embedded-linux/p/10367097.html

时间: 2024-10-07 02:24:16

go包管理之glide的相关文章

Golang学习--包管理工具glide

上一篇文章中我们已经成功的运行了go的代码,这是我们迈出的最基础的一步. 一个项目通常会依赖很多外部的库,当依赖的库比较多的时候,手工管理就会比较麻烦,这个时候就需要包管理工具出场了,帮你管理好所有依赖的库. php项目中使用composer,javascript项目中使用npm,那么在go项目中,我们需要使用什么? 包依赖工具的选择 当前go的包管理工具有glide.godep.govendor和gvt等,相关对比的文章可以查看<go依赖包管理工具对比>. 功能对比可以参考如下内容(虽然跟上

[golang] Glide 包管理

一.概述 golang的包管理工具有很多,本篇幅主要介绍glide进行包管理. 二.安装及命令介绍 go get github.com/Masterminds/glide glide create|init 初始化项目并创建glide.yaml文件. glide get 获取单个包 --all-dependencies 会下载所有关联的依赖包 -s 删除所有版本控制,如.git -v 删除嵌套的vendor glide install 安装包 glide update|up 更新包 三.案例测试

window下golang包管理glide使用说明

golang是一门简洁高效的开发 语言,但是包管理一直是一个痛点,如图 : 很多开源项目特别是github.com中的大量应用golang.org和google.golang.org中的源码,且由于被墙的原因也会导致各种不顺利,复制GOPATH里内容在团队人比较多的时候较复杂 包之前关系复杂,无法确切的知道自己包里引用哪些项目源,甚至可能有 一些被误删导致的问题 无法准确管理引用包源的版本,可能会导致一些项目编译不通过 不像java里有maven或者jar.donet里有dll文件等等,让使用方

亲测可用的golang sql例程与包管理

sqlite与golang package main import ( "database/sql" "fmt" "time" _ "github.com/mattn/go-sqlite3" ) func main() { //打开数据库,如果不存在,则创建 db, err := sql.Open("sqlite3", "./foo.db") checkErr(err) //创建表 sq

Golang高阶:Golang1.5到Golang1.12包管理

Golang1.5到Golang1.12包管理 1. 前言 Golang 是一门到如今有十年的静态高级语言了,2009年的时候算是正式推出了,然后到最近的一两年,2017-2018年的时候,突然直线上升,爆火了,得益于容器化运维/直播/短视频/区块链... Golang 语法简单,简单即是复杂,软件构建的核心在于将复杂的东西简单化,处理好复杂度. 作为一个 gopher,我们要知道他的包管理,这样才能合理化代码结构,做好工程管理.(gopher:地鼠) 2. GOPATH/ Golang 1.5

golang包管理的古往今来

https://golang.org/ before GO1.5-GOPATH 在GO1.5之前用GOPATH以及GOROOT这两个环境变量来决定包的位置. GOROOT就是告知当前go的安装位置,编译的时候从GOROOT去找sdk的system library. GOPATH的目的是为了告知go,需要代码的时候,去哪里查找.注意这里的代码,包括本项目和引用外部项目的代码.GOPATH可以随着项目的不同而重新设置. 从go 1.8开始,如果GOPATH没有被设置,会有一个默认值,在Unix上为$

包管理工具rpm和yum的用法

包管理工具rpm和yum的用法 一.rpm的用法 rpm原本是Rde Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎.逐渐收到其他发行版的采用,RPM套件管理方式的出现,让Linux易于安装.升级,间接提升了Linux的适用性. rpm用法:rpm [OPTION...] 1.rpm安装软件包,后面需要跟上程序包文件的绝对路径或相对路径 常用选项: -v:显示指令的执行过程 -vv:详细显示指令执行过程,便于排错 -h:以#号显示程

学习笔记之Linux程序包管理rpm、yum、编译

无论是Windows系统还是Linux系统,我们用户想要在操作系统上获得更多的乐趣还是更多的功能的话,就需要在一个干净的系统上安装各式各样的软件程序,Linux上的是ELF格式的,目前比较常见的程序包管理器如: Redhat软件包管理器---rpm Debian软件包管理器---dpkg 一.1.RPM 安装:rpm {-i|--install} [install-options] PACKAGE_FILE... -v: verbose,详细信息 -vv: 更详细的输出 -h: hashmark

Linux之Redhat系列程序包管理

安装.升级和卸载应用软件是每个系统不可或缺的一部分:对于在企业使用越来越广泛的Linux操作系统而言,强大而简洁的程序包管理机制为工程师们带来了很大的便利:下文主要介绍在RedHat系列的系统上如何使用RPM/YUM/编译三种方式去管理程序包. 一.RPM程序包管理 PRM全称是Red Hat Package Manager(RedHat 包管理器).Linux RPM软件包的命名有一定的规律:名称-版本-修正版-类型.rpm 例如: RPM命令详解: 功能: 安装.卸载.升级.查询和数据库维护