最新消息:yaf表单扩展中新增加了浮点数、日期和集合的校验。php yaf框架扩展实践三——表单

golang包管理工具Godep

Golang 2142浏览 0评论

golang自带的包管理工具go get已经非常强大了,通过go get可以将依赖的第三方库下载本GOPATH目录,在代码中直接import相应的代码库就可以了。但是还存在一些不足,比如:

  1. 通常我们会在本地开发多个项目,所有项目共同使用GOPATH中的第三方库。
  2. 因为在项目的版本管理里没有存放第三方库的代码,其他人下载下来的时候要重新go get所有依赖库。
  3. 假如我们换了一台电脑开发,要重新下载依赖库

上面的问题总结起来其实就是项目引用的第三方库没有列入到项目里面,如果把第三方库直接放到项目里就能解决这些问题了。这边介绍Godep这个工具,很多开源项目里都会看到。

godep的github地址:https://github.com/tools/godep,关于使用官方也说的挺多的了。关于godep,和nodejs的npm,java的maven使用上感觉有点不太一样,这里分享下实际的操作和碰到的坑。

安装

$ go get github.com/tools/godep

成功安装后,在GOPATH的bin目录下会有一个godep可执行的二进制文件,后面执行的命令都是用这个,如果该目录不在PATH目录下,需要使用全路径。

查看帮助

使用help可以查看使用帮助

$ godep help
Godep is a tool for managing Go package dependencies.

Usage:

    godep command [arguments]

The commands are:

    save     list and copy dependencies into Godeps
    go       run the go tool with saved dependencies
    get      download and install packages with specified dependencies
    path     print GOPATH for dependency code
    restore  check out listed dependency versions in GOPATH
    update   update selected packages or the go version
    diff     shows the diff between current and previously saved set of dependencies
    version  show version info

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

碰到什么问题的话,可以尝试从中找到一些信息。

将项目纳入Godep管理

假定项目一开始没有用Godep这个工具,那么可以使用godep save将项目中使用到的第三方库复制到项目目录下。

$ godep save
godep目录结构

godep目录结构

如图,在项目目录下会生成Godeps目录,其中Godeps.json文件用来记录项目用到了什么包,其中deps中的importpath表示下载的包路径,rev表示对应的版本号。

{
    "ImportPath": "godep",
    "GoVersion": "go1.5",
    "Packages": [
        "./..."
    ],
    "Deps": [
        {
            "ImportPath": "gopkg.in/bsm/ratelimit.v1",
            "Rev": "db14e161995a5177acef654cb0dd785e8ee8bc22"
        },
        {
            "ImportPath": "gopkg.in/redis.v3",
            "Comment": "v3.3.2",
            "Rev": "f7d4933032ef7d641fcea89be8a7c27c83a6f011"
        }
    ]
}

源码就存储在_workspace/src目录下。

在使用的时候踩了一坑,就是第三方库的源码不会拷贝到src目录下,具体可以查看:golang包管理工具godep save无效的坑

其中save这个命令提供了一个-r参数, 加上这个参数则会将代码中import的第三方包路径进行修改,如:

import (
    "gopkg.in/mgo.v2"
)

就会变成类似这样的:

import (
    "Godeps/_workspace/src/gopkg.in/mgo.v2"
)

其实就是Godep自己生成的目录。

不过我觉得这个-r用处不大,因为后面如果用Godep做壳来运行和编译golang程序的时候会自动将当前第三库目录设置成GOPATH目录。

用Godep进行编译和运行

项目用godep管理后,要编译和运行项目的时候再用go run和go build显然就不行了,因为go命令都是直接到GOPATH目录下去找第三方库。既然用godep管理了,自然要用其workspace下的库了。

这边可以用godep中的go命令了,这个其实就是将原先的go命令加了一层壳,在用godep执行go命令的时候,会将当前项目的workspace目录加入GOPATH变量中,并且优先级比默认的GOPATH高。使用os.Environ()就可以将当前的GOPATH打印出来

package main

import (
    "fmt"
    "os"
)

func main() {
    for _, e := range os.Environ() {
        fmt.Println(e)
    }
}
$ godep go run main.go
......

发布项目

项目搞完后,就可以发布出去了,其他人下载下来之后,因为第三方库在项目中一起发布了,所以就直接使用godep go run或者godep go build运行或者打包项目了,而不需要再次下载第三方库。

当然也可以通过godep restore将项目中使用到的第三方库下载下来到GOPATH的src目录中,不过这个命令用的也不多吧,毕竟项目里已经包含了需要的第三方库。

当然如果下载的项目中只有Godeps.json文件,而没有包含第三库则可以使用godep restore这个命令将所有的依赖库下来下来到GOPATH的src中。使用方式也很简单:

$ godep restore

这样godep就会根据Godeps.json文件的描述将需要的第三方库下载到GOPATH的src中,这样就可以避免一个一个去go get了。

转载请注明:快乐编程 » golang包管理工具Godep

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址