小白都能看懂的go语言包管理工具"DEP"详解

简介

众所周知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目录文件的加载

下图是官方给出的结构关系
小白都能看懂的go语言包管理工具

####dep的命令介绍

初始化:dep init

安装依赖包:dep ensure -add github.com/bitly/[email protected] 不推荐这种安装方法

更新依赖包:dep ensure -update 也可以单独更新一个包

同步:dep ensure 四种情况:工程中引入包、移除包、Gopkg.toml规则修改、不确定情况
状态:dep status

结果解释:
CONSTRAINT为Gopkg.toml中限定的版本
VERSION为当前vendor中的版本
REVISION为当前vendor中的修订号
LATESTCONSTRAINT限定下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

你可能感兴趣的:(golang)