安装与使用glide
鱼儿的博客 · · 2445 次点击 · · 开始浏览glide是一个golang的包管理工具,支持包版本管理,自动分析包依赖,用起来是很方便的。
但是glide使用时有一些项目结构规范需要遵循,下面记录一下关键点。
先翻墙
因为glide安装依赖是从github拖包下来的,所以需要给git配置一下环境变量,让它走我的shadowsocks代理,这样安装起来比较快。
另外,安装glide自身是通过curl完成的,所以需要给curl配置一下翻墙:
编辑~/.curlrc,添加如下内容:
安装glide
首先,要export一下GOPATH环境变量,指向你的项目目录(包含src目录的那个目录),之后在GOPATH目录下建立一个bin目录。
之后,执行命令:
它会在$GOPATH/bin目录下创建一个二进制程序叫做glide,为了方便你可以考虑在环境变量PATH中加入$GOPATH/bin来方便的使用glide。
调整项目结构
glide要求项目按照一定的结构组织,即源代码全部放置在"$GOPATH/src/项目名称/"里面,举例来说:
我的GOPATH=/Users/smzdm/Documents/github/bigpipe,里面的内容如下:
bin里保存的就是刚才的glide程序:
而我的项目代码放在src/bigpipe之下:
这基本是强制要求的(glide建议),GOPATH/src/项目名称 之内放置你的项目代码。
在程序中import包时,注意包的路径是从GOPATH/src开始的,也就是像这样引入config包:import "bigpipe/config"。
唯一可以放在src/bigpipe层级的就是main.go,令它属于package main即可。
glide安装项目
进入到GOPATH/src/bigpipe中,执行glide create来初始化glide项目。
它会分析你的程序引用了哪些外部包,并提供给你一些建议配置项,比如:选择包的版本等,我建议大家选择固定的依赖版本(不要包含任何版本区间),避免第三方包升级引入不可预期的问题。
之后它会在GOPATH/src/bigpipe中生成配置文件:glide.yaml,里面记录了项目依赖的外部包和版本等信息。
最后,执行glide install,它会根据glide.yaml中的依赖信息下载对应的包,全部保存到GOPATH/src/bigpipe/vender目录下:
观察glide.yaml可以看见第一行写着package:bigpipe,其实这就是glide的一个规范而已,说明当前在GOPATH/src/bigpipe项目下。
编译项目
glide只能帮我们管理包,但是不负责编译项目。
我们知道go build命令可以编译项目,编译上述项目我们需要进入GOPATH/src/bigpipe目录中(项目源代码目录),然后执行go build即可。
在该目录下只有main.go属于package main,所以go build会以它为入口开始编译,产出的二进制名字与目录名一致叫做bigpipe。
第三方包保存在vender目录下,而代码引入的是import "github.com/xxxx...",很显然GOPATH/src/github.com/xxxx...目录并不存在,那么go build为何可以编译通过呢?
这是golang 1.6之后的一个特性,也就是在引入包在src下找不到的情况下,会在vender目录中查找,这个查找的过程是(可以进一步阅读这里):
如果你是在src/a/b/c.go中引入了github.com/xxxx/yyyy包的话,它会依次在:
- src/a/b/vender/github.com/xxxx/yyyy
- src/a/vender/github.com/xxxx/yyyy
- src/vender/github.com/xxxx/yyyy
查找是否存在对应的包,所以上述bigpipe项目在GOPATH/src/bigpipe下使用glide安装了vender目录,所有bigpipe下的代码在引入github包时一定会扫描到GOPATH/src/bigpipe/vender,这就是glide的原理了。
一个例子
如果有疑惑可以参考这个项目作为例子:https://github.com/owenliang/bigpipe。
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
glide是一个golang的包管理工具,支持包版本管理,自动分析包依赖,用起来是很方便的。
但是glide使用时有一些项目结构规范需要遵循,下面记录一下关键点。
先翻墙
因为glide安装依赖是从github拖包下来的,所以需要给git配置一下环境变量,让它走我的shadowsocks代理,这样安装起来比较快。
另外,安装glide自身是通过curl完成的,所以需要给curl配置一下翻墙:
编辑~/.curlrc,添加如下内容:
安装glide
首先,要export一下GOPATH环境变量,指向你的项目目录(包含src目录的那个目录),之后在GOPATH目录下建立一个bin目录。
之后,执行命令:
它会在$GOPATH/bin目录下创建一个二进制程序叫做glide,为了方便你可以考虑在环境变量PATH中加入$GOPATH/bin来方便的使用glide。
调整项目结构
glide要求项目按照一定的结构组织,即源代码全部放置在"$GOPATH/src/项目名称/"里面,举例来说:
我的GOPATH=/Users/smzdm/Documents/github/bigpipe,里面的内容如下:
bin里保存的就是刚才的glide程序:
而我的项目代码放在src/bigpipe之下:
这基本是强制要求的(glide建议),GOPATH/src/项目名称 之内放置你的项目代码。
在程序中import包时,注意包的路径是从GOPATH/src开始的,也就是像这样引入config包:import "bigpipe/config"。
唯一可以放在src/bigpipe层级的就是main.go,令它属于package main即可。
glide安装项目
进入到GOPATH/src/bigpipe中,执行glide create来初始化glide项目。
它会分析你的程序引用了哪些外部包,并提供给你一些建议配置项,比如:选择包的版本等,我建议大家选择固定的依赖版本(不要包含任何版本区间),避免第三方包升级引入不可预期的问题。
之后它会在GOPATH/src/bigpipe中生成配置文件:glide.yaml,里面记录了项目依赖的外部包和版本等信息。
最后,执行glide install,它会根据glide.yaml中的依赖信息下载对应的包,全部保存到GOPATH/src/bigpipe/vender目录下:
观察glide.yaml可以看见第一行写着package:bigpipe,其实这就是glide的一个规范而已,说明当前在GOPATH/src/bigpipe项目下。
编译项目
glide只能帮我们管理包,但是不负责编译项目。
我们知道go build命令可以编译项目,编译上述项目我们需要进入GOPATH/src/bigpipe目录中(项目源代码目录),然后执行go build即可。
在该目录下只有main.go属于package main,所以go build会以它为入口开始编译,产出的二进制名字与目录名一致叫做bigpipe。
第三方包保存在vender目录下,而代码引入的是import "github.com/xxxx...",很显然GOPATH/src/github.com/xxxx...目录并不存在,那么go build为何可以编译通过呢?
这是golang 1.6之后的一个特性,也就是在引入包在src下找不到的情况下,会在vender目录中查找,这个查找的过程是(可以进一步阅读这里):
如果你是在src/a/b/c.go中引入了github.com/xxxx/yyyy包的话,它会依次在:
- src/a/b/vender/github.com/xxxx/yyyy
- src/a/vender/github.com/xxxx/yyyy
- src/vender/github.com/xxxx/yyyy
查找是否存在对应的包,所以上述bigpipe项目在GOPATH/src/bigpipe下使用glide安装了vender目录,所有bigpipe下的代码在引入github包时一定会扫描到GOPATH/src/bigpipe/vender,这就是glide的原理了。
一个例子
如果有疑惑可以参考这个项目作为例子:https://github.com/owenliang/bigpipe。