简介
众所周知GO语言包管理工具百花齐放,前有godep、glide、govendor,后有dep。
今天我们来了解一下"dep",看看它是怎样实现包管理的。
dep安装
二进制文件安装:
$ curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
MAC安装
$ brew install dep
GO get安装方法
$ go get -u github.com/golang/dep/cmd/dep
windows安装方法作为一个win黑,其实我是拒绝的
1.下载release版本。打开页面https://github.com/golang/dep/releases,下载最新的dep-windows-amd64.exe
2.将dep-windows-amd64.exe放入GOPATH/bin下,修改名称为dep
dep使用
####dep的结构介绍
当我们执行dep init
命令之后,会生成Gopkg.toml、Gopkg.lock文件和一个vendor目录。
Gopkg.toml:依赖清单。
描述了依赖包的版本、分支、下载源、裁剪规则等,同项目源代码一同作为solving方法的输入源生成Gopkg.lock文件
Gopkg.lock:包描述文件。详细的描述了依赖包分支、版本、修订号,作为vendoring方法的输入源下载依赖包源代码
vendor:依赖包源代码存储目录。go语言在1.5以后支持了vendor目录文件的加载
下图是官方给出的结构关系
####dep的命令介绍
初始化:dep init
安装依赖包:dep ensure -add github.com/bitly/go-simplejson@v1.0.1
不推荐这种安装方法
更新依赖包:dep ensure -update
也可以单独更新一个包
同步:dep ensure
四种情况:工程中引入包、移除包、Gopkg.toml规则修改、不确定情况
状态:dep status结果解释:
CONSTRAINT
为Gopkg.toml中限定的版本
VERSION
为当前vendor中的版本
REVISION
为当前vendor中的修订号
LATEST
为CONSTRAINT
限定下github中能满足要求的最新版本
裁剪:dep prune
清理无用包或文件
具体规则:
non-go=true清理无用的go文件
go-tests=true清理测试文件
unused-packages=true清理无用的依赖包
删除依赖包:dep ensure
dep并没有删除依赖包的命令
要删除依赖包首先在你的源代码中删除包的引用和调用,手动删除Gopkg.toml文件中的规则,最后执行
dep ensure
命令
tips:版本规则
=: 等于
!=: 不等于
>: 大于
<: 小于
>=: 大于或等于
<=: 小于或等于
-: 文字范围。 如: 1.2 - 1.4.5相当于>= 1.2, <= 1.4.5
~: 次版本号范围。如: ~1.2.3相当于>= 1.2.3, < 1.3.0
^: 主版本号范围。特别说明:前面没有任何符号相当于^。如: ^1.2.3相当于>= 1.2.3, < 2.0.0,1.2.3相当于^1.2.3。
[xX*]: 通配符. 如: 1.2.x相当于>= 1.2.0, < 1.3.0
####Gopkg.toml详解
required = ["github.com/user/thing/cmd/thing"] // 手动加载文件
ignored = ["github.com/user/project/pkgX"] // solving函数忽略文件
[[constraint]] // 依赖规则
name = "github.com/user/project2" // 包命,正常来说也会通过包名查找源代码下载地址
source = "github.com/myfork/project2" // 当查不到地址时,手动指定地址
version = "1.0.0" // 包版本规则
branch = "master" // 分支
revision = "abc123" // 修订号
[[override]] // 覆盖。依赖包产生冲突时,会覆盖掉普通依赖“慎用”
name = "github.com/x/y"
version = "2.4.0"
[metadata] // 自定义的数据,用于包下载
propertyX = "valueX"
[prune] // 裁剪
non-go = true // 清理无用go文件
unused-packages = true // 清理无用依赖包
[[prune.project]] // 可单独对某个依赖包制定规则
name = "github.com/project/name"
go-tests = true // 清理测试文件
non-go = false
####dep项目中的使用
按照惯性思维,我们要用一个依赖包首先肯定要安装它。而dep是一个比较聪明的管理工具,它会自动检测你go文件中import了哪些包文件,在比对本地的清单,当没有时会自动下载
所以日常使用的时候只需要下面两步
1.手动声明所依赖的包文件
package main
import (
...
"github.com/bitly/go-simplejson"
)
...
2.执行同步命令
$ dep ensure
tips: dep ensure命令是个万金油,我们日常开发90%都在用这个命令。当你从代码仓库中clone下来代码后别忘了执行一下dep ensure命令
###拓展(至小白)
在使用dep工具前,我们要了解一下go的工作区结构和GOPATH,否则你会踩很多不必要的坑
####go工作区结构
GOPATH/
src/ // 项目源代码目录
test/ // dep init 要在这个目录下执行
main.go
Gopkg.toml
Gopkg.lock
vendor/ // 依赖包源代码目录
bin/ // 可执行文件
main
pkg/ // 编译文件,分内核
darwin_amd64/
####GOPATH
GOPATH就是你现在所在的工作目录
查看GOPATH
$ go env
或者
$ echo $GOPATH
设置GOPATH
临时设置
$ export GOPATH=/yourproject/
永久设置不推荐,用起来比较麻烦
编辑你家目录的.bashrc 或者 .zshrc 写入上面的代码
###参考资料
dep官方文档:https://golang.github.io/dep/docs/ 英文的不友好
tips:go将在1.11版本中加入官方的管理工具
go modules
,届时将新增一个go mod
的命令
感兴趣的可以移步:https://systemdump.io/posts/2018-07-22-go-modules@TOC