一尘不染

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

go

我正在编写一个应用程序并导入一些包B。该软件包具有vendor目录,其中又包含package 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


阅读 189

收藏
2020-07-02

共1个答案

一尘不染

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

3)运行glide install --strip-vcs --strip-vendor(或等效的快捷方式glide install -s -v)以安装软件包并删除嵌套vendor/目录(我使用的滑行版本为0.11.0-dev,安装了go get -u github.com/Masterminds/glideglide 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)正确地获取并安装它们。

2020-07-02