依赖管理的选择

Go主要依赖管理工具包括dep,govendor,glide,gomodule。

dep:https://github.com/golang/dep

govendor:https://github.com/kardianos/govendor

glide:https://github.com/Masterminds/glide/releases

dep,govendor,gomodule,前两者是使用go 1.5版本的Vendor特性,已成为go的实际功能,其非常成熟;

gomodule是作为Go 1.11引入的新特性,还未正式合并作为一个功能,为此,go废弃了之前作为准官方的vendor机制,目的是为了摆脱Go项目中一直存在坏境变量:GOPATH,而且目前可以使用此功能配合athens,做到访问私人仓库,访问国外仓库,使依赖管理做到无任何多余的操作。参考为 Go module 搭建私服,需要搭建代理服务器,未来建议包依赖管理可使用该功能。

上述几种功能在使用中,面对私人仓库,均出现一些拉取错误,无法正常的进行拉取,进行相应的配置后,错误并未消除,选用glide后,可以顺利完成包管理的操作,而且目前来说,Glide几乎等同于官方依赖管理工具,gomodule也可以兼容Glide的管理,这里有包管理工具一些对比:https://github.com/Masterminds/glide/wiki/Go-Package-Manager-Comparison。

Glide

Glide信息可以参考官方文档:https://glidedocs.readthedocs.io/zh/latest/glide.yaml/

准备

下载glide,https://github.com/Masterminds/glide/releases,将文件放至$GOROOT/bin。

使用代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import (
"log"

. "gitlab.com/Utils/ErrCode"
)

func main() {
log.Println("test", ERROR["OK"])

return
}

使用Glide

注意:Glide与其他利用Vendor特性的工具一样,工程项目必须要放在GOPATH目录下。

大概流程:

1
2
3
4
5
6
#进入到项目目录
cd ~/src/testDep
#glide初始化,初始化配置文件glide.yaml
glide init
#glide加载依赖包,自动归档到vendor目录
glide up -v

示例:

在项目顶层目录运行:

1
$ glide.exe init testDep  # specify project name

该工具会将项目依赖自动扫入配置文件(glide.yaml)中。

1
2
3
package: testDep
import:
- package: gitlab.com/Utils

接下来可以使用"glide.exe install",但对于私有库,若直接安装将无法正常clone到git项目,需要手动对配置文件进行改造:

1
2
3
4
5
package: testDep
import:
- package: gitlab.com/Utils
repo: git@172.16.8.189:third-party/Utils.git
version: branch

repo:指定真实仓库地址;

version:指定tag,branch等其他参数,具体可参考文档。

完成后,可使用:

1
$ glide.exe install // 或者是glide up -v,配置文件更改后使用,一般第一次使用install,后面使用up

正常情况下,会自动下载Git项目到vendor目录中,且生成"glide.lock"。

其他操作

手动更新包依赖

glide get操作通过手动维护Git包,使用此命令,包配置会自动配置到配置文件中,但对于私有仓库的操作是无法成功的。

示例,#后面跟tag,branch。

1
glide get github.com/go-sql-driver/mysql#v1.2

包被墙

包若因为网络因素被墙,可使用glide的mirror命令绕过一些包访问的问题。

例如https://golang.org/x/net。

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

然后使用update。

这里glide无法处理包的子包,那可以参考:让golang依赖也走mirror,参考https://github.com/jokimina/glide-mirrors-yaml,一些常用的mirror,将文件放到~/.glide/。

对包被墙的一些解决办法:golang 包管理工具,综合来看,唯有代理才能彻底解决这个痛点。

项目管理

上传git项目一般是只需上传glide.lock,glide.yaml即可,vendor目录可不做上传,若网络包被本地修改,或包需翻墙进行下载,此时建议一并上传。

若依赖需要更新,或者配置更改,则可使用update。

1
$ glide.exe update

Add 2019-3-19

go如今已经发布到1.12了,之前说过Go1.11强势发布了gomodule特性,以此来统一整个包管理的江湖,但在之前刚发布时,对这个的使用实在是有点搞不明白,不过在不经意间就找到了一个Go的包代理网站,以此来使用gomodule即可应对各类包。https://goproxy.io

1、升级Go1.12,启用GO111MODULE

1
export GO111MODULE=on

2、配置GOPROXY

1
export GOPROXY=https://goproxy.io