golang包管理工具dep

初学golang一段时间后,终于进入能用golang写demo项目的阶段,结果发现原始一直没有学golang包管理工具,对于用习惯npm的开发者,也知道基本现代语言都有包管理工具,于是找了一圈,果然找到很多管理工具,其中就包括官方推荐的dep。

安装

安装dep

$ go get -u github.com/golang/dep/cmd/dep

mac用户也可以采用brew安装

$ brew install dep

验证安装

$ dep
dep is a tool for managing dependencies for Go projects

Usage: dep <command>

Commands:

  init    Initialize a new project with manifest and lock files
  status  Report the status of the project's dependencies
  ensure  Ensure a dependency is safely vendored in the project
  prune   Prune the vendor tree of unused packages

Examples:
  dep init                               set up a new project
  dep ensure                             install the project's dependencies
  dep ensure -update                     update the locked versions of all dependencies
  dep ensure -add github.com/pkg/errors  add a dependency to the project

Use "dep help [command]" for more information about a command.

dep工作流

设置环境变量

一旦安装dep后,我们需要为项目选择根目录,dep要求路径必须在$GOPATH/src,如果还没有设置$GOPATH,可以按照下边方式设置。

#设置环境变量
vi /etc/profile
export GOROOT=/usr/local/go  #设置为go安装的路径
export GOPATH=$HOME/go   #默认安装包的路径
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
source /etc/profile

GOPATH允许多个目录,当有多个目录时,请注意分隔符,多个目录的时候Windows是分号;,Linux系统是冒号:
当有多个GOPATH时默认将go get获取的包存放在第一个目录下
$GOPATH目录约定有三个子目录

src存放源代码(比如:.go .c .h .s等)
pkg编译时生成的中间文件(比如:.a)
bin编译后生成的可执行文件(为了方便,可以把此目录加入到 $PATH 变量中,如果有多个gopath,那么使用${GOPATH//://bin:}/bin添加所有的bin目录)

准备一个demo程序

可以随便创建一个项目,用多个包,创建的项目如下:

//main.go
package main

import (
    "net/http"
    "go.uber.org/zap"
    "github.com/beego/mux"
)

func main() {
    logger, _ := zap.NewProduction()
    defer logger.Sync()
    sugar := logger.Sugar()

    mx := mux.New()
    mx.Handler("GET", "/", http.FileServer(http.Dir(".")))
    sugar.Fatal(http.ListenAndServe("127.0.0.1:9090", mx))
}

初始化

设置好环境变量后,我们开始初始化

$ cd $GOPATH/src && mkdir myapp
$ dep init
$ ls -ll
-rw-r--r--  1 bugzhang  staff  286  4 27 14:49 Gopkg.lock
-rw-r--r--  1 bugzhang  staff  666  4 27 14:49 Gopkg.toml
drwxr-xr-x  2 bugzhang  staff   64  4 27 14:49 vendor

可以看到,dep init后生成了三个文件,这三者的关系如下:

构建

现在我们的depdemo已经加入了Gopkg.toml和Gopkg.lock。这时,如果你将depdemo clone到你的本地,你还无法进行reproduceable build,因为这时vendor还不存在。这时我们需要执行下面命令来根据Gopkg.toml和Gopkg.lock中的数据构建vendor目录和同步里面的包:

$ dep ensure

$ ls -F
Gopkg.lock  Gopkg.toml  main.go  vendor/

ensure成功后,就可以进行reproduceable build了。

补充说明

Gopkg.toml

该Gopkg.toml文件最初由生成dep init,并且主要是手动编辑的。它包含几种管理dep行为的规则声明:

  • 依赖关系规则: constraints并overrides允许用户指定哪些版本的依赖关系可接受,以及应从哪些版本检索。
  • 包图规则: required并ignored允许用户分别通过包含或排除导入路径来操作导入图。
  • metadata是dep将忽略的键值对的用户定义的映射。他们为建立在dep之上的工具提供数据支架。
  • prune设置决定哪些文件和目录可以被认为是不必要的,从而自动从中删除vendor/。

Gopkg.lock

该Gopkg.lock文件由dep ensure和生成dep init。它是求解函数的输出:一个项目依赖关系图的过渡完整快照,表示为一系列[[project]]节。这意味着:

  • 项目需要编译的每个软件包
  • 加上任何required包裹
  • 减去任何ignored包裹

发表评论

电子邮件地址不会被公开。 必填项已用*标注

😉😐😡😈🙂😯🙁🙄😛😳😮:mrgreen:😆💡😀👿😥😎😕