和Go1一起.6.当你阅读时,自动售货机是内置的.这是什么意思?只有一件事需要记住:
当使用go build
或go run
等go
个工具时,他们首先判断依赖项是否位于./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.有很多,谷歌搜索一下就会发现其中几个.
请允许我提到两个与供应商文件夹一起使用且不会与您发生冲突的选项:
简而言之,这些工具将判断您的ou
代码,找到远程依赖项,并将它们复制到from、$GOPATH/src
、to和$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和其他程序中的最新错误修复程序运行(这些都有固定的修复程序!)诸若此类.