如何处理嵌套"供应商" Go包中的目录?

时间:2016-07-26 18:10:29

标签: go package-managers

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

我不希望将vendor嵌套在toy目录中。

1 个答案:

答案 0 :(得分:2)

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

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

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/目录(我使用滑动版本0.11.0-dev与{{一起安装) 1}}; go get -u github.com/Masterminds/glide显示glide install --help选项。)

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

--strip-vendor

我认为最好将Cat pushes the toy. The toy makes a very loud noise. 目录包含在您的中 - 这会让事情变得混乱,让图书馆用户的生活变得更加困难(例如,需要记住使用vendor的其他选项)。让这些库的“客户” - glide打包 - 要么提供所有依赖项(包括传递的依赖项),要么在package main等配置中指定它们,并让工具(滑动)获取和正确安装它们。