首先我读了这个答案:Vendoring in Go 1.6,然后我用它作为我的例子.

我的戈帕特是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没有用呢?我的围棋版本是1.6.2.

推荐答案

和Go1一起.6.当你阅读时,自动售货机是内置的.这是什么意思?只有一件事需要记住:

当使用go buildgo rungo个工具时,他们首先判断依赖项是否位于./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(用于软件包缓存).

So, how do I use ./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

简而言之,要使用vendoring,您可以使用相同的github.com/zenazn/goji完整路径将文件复制到vendoring director中.

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

An easier way instead of copying everything manually

而不是查找和复制所有25个以上的供应商项目,管理其版本,更新其他项目等...最好使用dependency management tool.有很多,谷歌搜索一下就会发现其中几个.

请允许我提到两个与供应商文件夹一起使用且不会与您发生冲突的选项:

  • godep
  • 政府官员

简而言之,这些工具将判断您的ou代码,找到远程依赖项,并将它们复制到from$GOPATH/srcto$GOPATH/src/ou/vendor目录(实际上,无论您运行它们时所在的当前目录是什么).

例如,假设您已经使用依赖项的普通GOPATH/src/gihub安装在$GOPATH/src/ou/项目中安装了所有依赖项并正常工作.您的项目将运行,并且您的测试将验证一切是否与您拥有的repos的版本完全一致.以Godep为例,您将从项目根文件夹$GOPATH/src/ou/运行以下代码:

godep save ./...

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

到目前为止,Godep是最受欢迎的.他们在地鼠 slack 组有自己的 slack 频道.而且,它也是我在我的团队中使用的.

Govendo是我读到的另一个 Select ,它有一个很好的同步功能.不过我还没用过.

Over Usage of Dependency Management Tool

这纯粹是观点,我相信仇恨者会投反对票...但是,由于我需要完成关于这个主题的博客文章,让我在这里提到,大多数人太担心围棋的深度管理.

是的,需要将repo锁定到您所依赖的版本,这样您才能确保您的系统在生产中构建.是的,需要确保依赖项中断某些东西的方式不会发生 destruct 性更改.

对于这些,绝对要使用依赖项管理.

但是,在现实中,存在着过度使用锁定大量依赖项的简单项目……

您可能只需要锁定1个依赖项;否则,您需要最新版本的MySQL驱动程序和测试断言框架来修复错误.

这就是除了依赖项管理工具之外,使用./vendor/文件夹才能真正发挥作用的地方:您只需要复制需要锁定的repo.

您可以有 Select 地 Select 一个行为不端的回购,并将其放入您的./供应商/文件夹中.通过这样做,您就是在告诉您的消费者:

嘿,这一次回购需要在这次修改时按兵不动.所有其他版本都很好,并且使用最新的版本,并且经常更新到go get -u ./...;但是,这个版本在较新的版本中失败了,所以不要升级这个repo.

但是,如果使用依赖项管理工具一刀切地保存所有依赖项,您基本上就是在告诉您的消费者:

供应商文件夹中20个回购协议中的一个或多个可能有问题,也可能没有问题.您可能无法更新它们.您可能无法获取最新的MySQL驱动程序.我们根本不知道哪一个可能会或可能不会导致问题,只是锁定了一些在我跑godep save的时候有效的东西.所以是的,升级风险自负.

就我个人而言,我已经遇到过这种情况好几次了.一个依赖项用突破性的更改进行了更新,我们有数十个依赖于它的repo.仅在/供应商中提供一个回购就允许我们使用该依赖项的一个版本,而go get ./...继续正常运行,以便所有其他回购都能获得最新版本.我们使用PSQL、MySQL和其他程序中的最新错误修复程序运行(这些都有固定的修复程序!)诸若此类.

Go相关问答推荐

Google OAuth2没有刷新令牌

gorm如何声明未自动更新的unix时间戳米尔斯字段

编辑时保留YAML文件中的单引号

在Uber FX中实现后台进程正常关闭的正确方式是什么?

如何用Golang解码这个嵌套的json?

go测试10m后如何避免超时

如何将 goose 迁移与 pgx 一起使用?

是否需要手动调用rand.Seed?

命令行参数在 Golang 程序中不正确地接受为参数

Go test "-run -" 标志执行测试更快

如何将 DirName 和 serial 添加到 X509v3 Authority Key Identifier

在 Go sync.Map 中,为什么这部分实现不一致或者我误解了什么?

Go struct 匿名字段是公开的还是私有的?

使用自定义处理程序 nats golang 保留订阅方法

如何使用 Docker 引擎 SDK 和 Golang 运行 docker 挂载卷

数据流中的无根单元错误,从 Golang 中的 PubSub 到 Bigquery

我相信我正确地在 sRGB 和线性 RGB 之间进行了转换,那么为什么深色的结果看起来更糟呢?

GoReleaser 和 ssh-agent Github 操作:为什么无法读取用户名...终端提示已禁用?

为什么 template.ParseFiles() 没有检测到这个错误?

如何解决在mac m1中运行gcc失败退出状态1?