我正在编写一个应用程序并导入一些包B。该软件包具有vendor目录,其中又包含package C。我也想C直接在我的应用程序中使用该软件包。
B
vendor
C
因此,我决定使用glide包管理器。这两种下载B和C进入myapp/vendor目录,但保持myapp/vendor/B/vendor/C里面。因此,当我构建自己的应用程序时,它会使用两个不同的C版本(也使用myapp/vendor/C)来构建。
glide
myapp/vendor
myapp/vendor/B/vendor/C
myapp/vendor/C
如何避免呢?
1)要么,有可以处理该问题的软件包管理器?govend似乎有其--prune论点,但它不尊重这些C软件包的版本。
govend
--prune
2)或者,如何glide正确处理嵌套vendor目录?
编辑
我的例子是https://github.com/orloffm/flat。它使用cat和-间接- toy包。cat有一些 较旧的供应商版本 ,toy并已提交到存储库中。我这样做glide create && glide install并最终得到:
https://github.com/orloffm/flat
cat
toy
glide create && glide install
. ├── flat.go ├── glide.lock ├── glide.yaml └── vendor └── github.com └── orloffm ├── cat │ ├── cat.go │ ├── vendor │ │ └── github.com │ │ └── orloffm │ │ └── toy │ │ └── toy.go │ └── vendor.yml └── toy └── toy.go
我不想使用嵌套vendor目录toy。
flat通过进行以下更改,我能够安装和运行您的程序(还向您发送了PR https://github.com/orloffm/flat/pull/1):
flat
1)flat.go由于以下原因需要导入“ github.com/orloffm/toy”- new(toy.RubberToy)否则无法编译
new(toy.RubberToy)
2)添加glide.yaml同时列出“ cat”和“ toy”库作为依赖项的文件:
glide.yaml
package: github.com/orloffm/flat import: - package: github.com/orloffm/cat - package: github.com/orloffm/toy
3)运行glide install --strip-vcs --strip-vendor(或等效的快捷方式glide install -s -v)以安装软件包并删除嵌套vendor/目录(我使用的滑行版本为0.11.0-dev,安装了go get -u github.com/Masterminds/glide;glide install --help显示了该--strip-vendor选项)。
glide install --strip-vcs --strip-vendor
glide install -s -v
vendor/
go get -u github.com/Masterminds/glide
glide install --help
--strip-vendor
4)GOBIN = $ PWD去安装&& ./flat产生
Cat pushes the toy. The toy makes a very loud noise.
我认为最好的方法是 不要 将vendor目录包含在您的 库中 -这样会弄乱事情,并使库用户的生活更加困难(例如,需要记住要使用其他选项来进行glide)。让那些库的“客户端”(程序package main包)供应所有依赖项(包括传递性依赖项),或者在诸如之类的配置中指定它们,glide.yaml并让工具(glide)正确地获取并安装它们。
package main