加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

使用vendor管理Golang项目依赖

发布时间:2020-12-16 19:16:58 所属栏目:大数据 来源:网络整理
导读:http://www.tuicool.com/articles/NjMzIbJ 我们在项目中除了大量的使用Python外,也大量的使用了Golang构建高效基础运行服务。在使用Golang过程中,我们发现Golang程序缺少依赖库版本功能是一个非常令人头大的问题:某些依赖在某个commit之后发生了API变更之

http://www.tuicool.com/articles/NjMzIbJ


我们在项目中除了大量的使用Python外,也大量的使用了Golang构建高效基础运行服务。在使用Golang过程中,我们发现Golang程序缺少依赖库版本功能是一个非常令人头大的问题:某些依赖在某个commit之后发生了API变更之后,如果不修改代码很难兼容,然而开发者之间很有可能因为参与的时间不同,导致执行go get命令获取的版本不同,而导致在不同电脑上出现编译不通过问题。同时,在多个程序中,如果使用的commit版本不同,也可能会导致程序编译过程中出现不同的问题。

在之前,我们解决这个问题有两个方案,一种是拆解go get命令的执行,首先创建对应依赖目录,利用git命令切换至指定的commit,然后执行go install命令。另外一种比较省事的方法是使用godep工具,这里就不做过多介绍了,具体可以参考文档或者搜索中文教程。

在Golang1.5之后,Go提供了GO15VENDOREXPERIMENT环境变量,用于将go build时的应用路径搜索调整成为当前项目目录/vendor目录方式。通过这种形式,我们可以实现类似于godep方式的项目依赖管理。不过起码在程序编译过程中,再也无需在其他端部署一个godep工具。

在使用之前,需要安装一个辅助工具(如果Golang自改一个就好了):go get -u -v github.com/kardianos/govendor

下面,我们用一个例子来说明。首先有一个名为vendorproj的项目。假如只有一个文件:

package main

import (
    "github.com/yeeuu/echoic"
)

func main() {
    e := echoic.New()
    e.SetDebug(true)
    e.Run("127.0.0.1:4321")
}

执行一下命令就可以生成vendor文件夹:

$ govendor init
$ ls
main.go    vendor
$ cd vendor/
$ ls
vendor.json

这个vendor.json会类似godep工具中的描述文件版本的功能。接下来,需要执行命令将当前应用必须的文件包含进来

$ govendor add +external

如果需要更新或移除,可以参考一下工具的具体文档使用update或者remove命令即可。这样会在vendor目录下将必须的编译文件移入进来(注意:测试所需依赖并不包含,依赖项目的测试文件也不会包含)。

$ ls
github.com  golang.org  vendor.json
$ cat vendor.json
{
    "comment": "","ignore""test",68)">"package": [
        {
            "path""github.com/yeeuu/echoic",68)">"revision""a7d6994f92e2dc60cff071ae38b204fbd4bd2a3f",68)">"revisionTime""2015-12-18T11:14:29+08:00"
        },{
            "golang.org/x/net/context",68)">"1d9fd3b8333e891c0e7353e1adcfe8a612573033",68)">"2015-11-13T15:40:13-08:00"
        }
    ]
}
$ cd github.com/yeeuu/echoic
$ ls
LICENSE     context.go  group.go    router.go
README.md   echoic.go   response.go

通过设置环境变量GO15VENDOREXPERIMENT=1使用vendor文件夹构建文件。可以选择export GO15VENDOREXPERIMENT=1或者干脆GO15VENDOREXPERIMENT=1 go build执行编译。

通过这种方式就可以保证程序能够实现类似Python中Virtualenv的模式,实现不同程序使用不同版本依赖的目的。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读