如何在Go包中处理嵌套的"vendor"目录?

Mik*_*lov 7 package-managers go

我正在编写一个应用程序并导入一些包B.这个包的vendor目录里面包含了包C.我也想C直接在我的应用程序中使用该包.

所以我决定使用glide包管理器.这两种下载BC进入myapp/vendor目录,但保持myapp/vendor/B/vendor/C里面.因此,当我构建我的应用程序时,它构建了两个不同版本的C(也有myapp/vendor/C).

怎么避免呢?

1)是否有一个包管理器来处理它?govend似乎与它的--prune论点,但它不尊重这些C包的版本.

2)或者,如何glide正确处理嵌套vendor目录?

编辑

我的例子是https://github.com/orloffm/flat.它使用cat和 - 间接 - toy包.cat有一些旧版本toyvendored并提交到存储库.我这样做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
Run Code Online (Sandbox Code Playgroud)

我不希望有嵌套vendor目录toy.

dmi*_*ris 2

我能够flat通过进行以下更改来安装并运行您的程序(还向您发送了 PR https://github.com/orloffm/flat/pull/1):

1) flat.go 需要导入“github.com/orloffm/toy”,因为new(toy.RubberToy)- 否则它无法编译

2)添加glide.yaml将“cat”和“toy”库列为依赖项的文件:

package: github.com/orloffm/flat
import:
- package: github.com/orloffm/cat
- package: github.com/orloffm/toy
Run Code Online (Sandbox Code Playgroud)

3)运行glide install --strip-vcs --strip-vendor(或等效的快捷方式glide install -s -v)来安装软件包并删除嵌套vendor/目录(我使用的是glide版本0.11.0-dev,安装有go get -u github.com/Masterminds/glide;glide install --help显示--strip-vendor选项)。

4) GOBIN=$PWD go install && ./flat 生成

Cat pushes the toy.
The toy makes a very loud noise.
Run Code Online (Sandbox Code Playgroud)

我认为最好的方法是不要将该vendor目录包含到您的中- 这会使事情变得混乱并使库用户的生活变得更加困难(例如,需要记住使用附加选项glide)。让这些库的“客户端” -package main包 - 要么提供所有依赖项(包括传递依赖项),要么在配置中指定它们,例如glide.yaml并让工具(glide)正确获取和安装它们。