简介:
golang的包管理工具类似于java的maven、python的pip、js的npm,可以实现依赖包的统一管理;有很多:govendor、godep、glide,挑一个自己喜欢的用吧。mac安装的话都可以使用brew Install godep/govendor/glide
go的环境管理类似于python的virtualenv;用来实现多个go版本并行运行的goenv:https://bitbucket.org/ymotongpoo/goenv
go的包管理工具对比:https://ieevee.com/tech/2017/07/10/go-import.html
GOROOT并不是必须要设置的。
GOROOT不是必须要设置的。参见Installing to a custom location,默认go会安装在/usr/local/go下,但也允许自定义安装位置,GOROOT的目的就是告知go当前的安装位置,编译的时候从GOROOT去找SDK的system libariry。
例如我用的是ubuntu 16.04,默认go的版本是1.6,如果我想升级为更新的版本,就需要自定义安装,所以我设置了GOROOT:export GOROOT=$HOME/go1.7.4
。
GOPATH必须要设置,但并不是固定不变的
GOPATH的目的是为了告知go,需要代码的时候,去哪里查找。注意这里的代码,包括本项目和引用外部项目的代码。GOPATH可以随着项目的不同而重新设置。
GOPATH下会有3个目录:src, bin, pkg。
- src目录:go编译时查找代码的地方
- bin目录:go get godep这种bin工具的时候,二进制文件下载的目的地
- pkg目录:编译生成的lib文件存储的地方。
godep
godep的使用者众多,如docker,kubernetes, coreos等go项目很多都是使用godep来管理其依赖,当然原因可能是早期也没的工具可选。
godep早期版本并不依赖vendor,所以对go的版本要求很松,go 1.5之前的版本也可以用,只是行为上有所不同。在vendor推出以后,godep也改为使用vendor了。
godep使用很简单:当你的项目编写好了,使用GOPATH的依赖包测试ok了的时候,执行:
$ godep save
以hcache为例,执行go save
,会做2件事:
- 扫描本项目的代码,将hcache项目依赖的包及该包的版本号(即git commit)记录到Godeps/Godeps.json文件中
- 将依赖的代码从GOPATH/src中copy到vendor目录(忽略原始代码的.git目录)。对于不支持vendor的早期版本,则会拷贝到Godeps/_workspace/里
一个Godeps.json的例子。
{
"ImportPath": "github.com/silenceshell/hcache",
"GoVersion": "go1.7",
"GodepVersion": "v79",
"Deps": [
{
"ImportPath": "github.com/tobert/pcstat",
"Rev": "91a7346e5b462a61e876c0574cb1ba331a6a5ac5"
},
{
"ImportPath": "golang.org/x/sys/unix",
"Rev": "0b25a408a50076fbbcae6b7ac0ea5fbb0b085e79"
}
]
}
如果要增加新的依赖包:
- Run go get foo/bar
- Edit your code to import foo/bar.
- Run godep save (or godep save ./…).
如果要更新依赖包:
- Run go get -u foo/bar
- Run godep update foo/bar. (You can use the … wildcard, for example godep update foo/…).
godep还支持godep restore
,可以将vendor下的代码反向拷贝到$GOPATH下。不过我没想到这个功能在什么情况下可以用到。
如何下载外网的依赖包?
正规和可信任的方式是从github上下载。golang 在 github 上建立了一个镜像库,如 https://github.com/golang/net 即是 https://golang.org/x/net 的镜像库。因此获取 golang.org/x/net 包(其他包类似),其实只需要以下步骤:
- mkdir -p $GOPATH/src/golang.org/x
- cd $GOPATH/src/golang.org/x;git clone https://github.com/golang/net.git
有说可以从Golang 中国下载,https://golangtc.com/packages它提供了这个服务,其实里面不过是github的链接地址
据说:https://gopm.io/download 也是一种办法
使用go get命令除了会下载指定的项目代码,还会去下载这个项目所依赖的所有项目,并且下载完会自动安装:go help get查看帮助信息
go的所有依赖包(内部和外边)都放入gopath里面
有些包即使走代理,下载也非常慢,但是github的zip压缩包下载速度比较快,可以试试zip包解压的方式,直接解压到目的目录
Golang的配置信息处理框架Viper
什么是Viper
Viper是一个方便Go语言应用程序处理配置信息的库。它可以处理多种格式的配置。它支持的特性:
- 设置默认值
- 从JSON、TOML、YAML、HCL和Java properties文件中读取配置数据
- 可以监视配置文件的变动、重新读取配置文件
- 从环境变量中读取配置数据
- 从远端配置系统中读取数据,并监视它们(比如etcd、Consul)
- 从命令参数中读物配置
- 从buffer中读取
- 调用函数设置配置信息
为什么要使用Viper
在构建现代应用程序时,您不必担心配置文件格式; 你可以专注于构建出色的软件。
Viper 可以做如下工作:
- 加载并解析JSON、TOML、YAML、HCL 或 Java properties 格式的配置文件
- 可以为各种配置项设置默认值
- 可以在命令行中指定配置项来覆盖配置值
- 提供了别名系统,可以不破坏现有代码来实现参数重命名
- 可以很容易地分辨出用户提供的命令行参数或配置文件与默认相同的区别
Viper读取配置信息的优先级顺序,从高到低,如下:
- 显式调用Set函数
- 命令行参数
- 环境变量
- 配置文件
- key/value 存储系统
- 默认值
Viper 的配置项的key不区分大小写。
来源:https://ieevee.com/tech/2017/07/10/go-import.html
http://blog.51cto.com/13599072/2072753
https://github.com/spf13/viper