小编典典

我应该如何在Go 1.6中使用供应商?

go

我的gopath是GOPATH="/Users/thinkerou/xyz/",跟随如下:

thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ pwd
/Users/baidu/xyz/src/ou
thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ ls
main.go vendor

现在,我使用go get,然后变为:

thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ ls
main.go vendor
thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ cd vendor/
thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou/vendor$ ls
vendor.json
thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou/vendor$ cd ../..
thinkerou@MacBook-Pro-thinkerou:~/xyz/src$ ls
github.com ou
thinkerou@MacBook-Pro-thinkerou:~/xyz/src$ cd github.com/
thinkerou@MacBook-Pro-thinkerou:~/xyz/src/github.com$ ls
zenazn

vendor.json 这是:

{
    "comment": "",
    "package": [
        {
            "path": "github.com/zenazn/goji"
        }
    ]
}

那么,我应该使用什么命令?为什么没用vendor?我的go版本是1.6.2。


阅读 304

收藏
2020-07-02

共1个答案

小编典典

借助Go1.6,您可以在阅读时内置供应商。这是什么意思?只有一件事要牢记:

当使用go诸如go build或的工具时go run,他们首先检查依赖项是否位于中./vendor/。如果是这样,请使用它。如果不是,请还原到该$GOPATH/src/目录。

Go 1.6中的实际“查找路径”依次为:

./vendor/github.com/zenazn/goji
$GOPATH/src/github.com/zenazn/goji
$GOROOT/src/github.com/zenazn/goji

话虽如此,go get将继续安装到您中$GOPATH/src;并且,go install将安装$GOPATH/bin为二进制文件或$GOPATH/pkg程序包缓存。

因此,如何使用./vendor?!?!

呵呵,有了以上知识,这很简单:

mkdir -p $GOPATH/src/ou/vendor/github.com/zenazn/goji
cp -r $GOPATH/src/github.com/zenazn/goji/ $GOPATH/src/ou/vendor/github.com/zenazn/goji

简而言之,要使用github.com/zenazn/goji供应商,您需要使用相同的完整路径将文件复制到供应商主管中。

现在,go build / install / run工具将看到并使用您的供应商文件夹。

无需手动复制所有内容的简便方法

与其查找并复制所有25个以上的供应商项目,管理其版本,更新其他项目等,不如使用 依赖管理工具 。那里有很多,有些谷歌搜索会指向您几个。

让我说说两个可以与vendor文件夹一起使用并且不会打败您的文件夹:

  • Godep
  • Govendor

简而言之,这些工具将检查您的ou代码,找到远程依赖项,并将其 您的目录复制$GOPATH/src
您的$GOPATH/src/ou/vendor目录(实际上,运行它们时所在的当前目录)。

例如,假设您已经$GOPATH/src/ou/使用正常的依赖项GOPATH / src /
github安装了所有依赖项,并在项目中正常工作。您的项目将运行,并且您的测试将验证一切都与您所拥有的回购协议的确切版本一起使用。以Godep为例,您可以从项目的根文件夹运行此文件$GOPATH/src/ou/

godep save ./...

这会将项目使用的所有依赖项复制到./vendor文件夹中。

Godep是迄今为止最受欢迎的。他们在Gopher Slack组中拥有自己的Slack频道。而且,这是我在团队中使用的一种。

Govendor是我阅读的另一种选择,具有不错的同步功能。我还没有用过。

过度使用依赖管理工具

这纯粹是观点,我敢肯定仇恨者会拒绝投票。但是,由于我需要完成有关该主题的博客文章,因此在这里我要提一提,大多数人过分担心Go中的依赖管理。

是的,有必要将存储库锁定到您所依赖的版本,以确保系统可以在生产环境中构建。是的,有必要确保对依赖项进行中断的方式不做任何重大更改。

绝对要使用依赖管理。

但是,实际上,简单项目的使用过多,它们会锁定大量依赖项…

您可能只需要锁定1个依赖项;否则,您需要最新版本的MySQL驱动程序和测试声明框架以进行错误修复。

在这里,./vendor/除了依赖项管理工具之外,使用文件夹确实可以发挥作用:您只需要复制需要锁定的存储库即可。

您可以有选择地选择一个行为不当的存储库,并将其放入./vendor/文件夹中。这样,您就告诉消费者:

嘿,这个版本需要推迟。其他所有的都很好,并且使用最新的并经常更新go get -u ./...;
但是,此版本使用较新的版本失败,因此请不要升级此版本库。

但是,如果使用依赖项管理工具全面保存所有依赖项,则基本上是在告诉用户:

供应商文件夹中20个中的一个或多个存储库可能有问题,也可能没有问题。您可能会或可能无法更新它们。您可能无法获得最新的MySQL驱动程序。我们根本不知道哪些可能会或可能不会导致问题,只是锁定了我运行时起作用的东西godepsave。是的,升级风险自负。

就个人而言,我已经遇到过几次。依赖项已进行了重大更改,并且有数十个依赖项。在/ vendor中只提供一个仓库,就可以使我们使用该版本的依赖关系,而goget./...对于所有其他仓库,它可以继续正常运行以获取最新版本。我们使用PSQL和MySQL及其他版本中的最新错误修复程序(这些程序有持续的修复程序!)等等来运行。

2020-07-02