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

How to handle nested "vendor" directories in Go packages?

我正在编写一个应用程序并导入一些包 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 有一些 旧版本 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

我不想用 toy.

嵌套 vendor 目录

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

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

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

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

Cat pushes the toy.
The toy makes a very loud noise.

我认为最好的办法是 而不是 vendor 目录包含到您的 - 这会把事情搞得一团糟让库用户的生活更加困难(例如,需要记住使用附加选项 glide)。让这些库的 "clients" - package main 包 - 供应所有依赖项(包括可传递的依赖项)或在配置中指定它们,例如 glide.yaml 并让工具(滑动)到获取并正确安装它们。