【问题标题】:How to handle nested "vendor" directories in Go packages?如何处理 Go 包中嵌套的“供应商”目录?
【发布时间】:2016-07-26 18:10:29
【问题描述】:

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

【问题讨论】:

  • 我现在不用glide,但你确定你有最新版本吗?只需快速浏览一下文档即可显示 "Because of this Glide flattens the dependency tree into a single top level vendor/ directory."
  • 正如 JimB 所说,我使用的大多数当前供应商工具都会自动扁平化依赖关系树。这实际上是必需的,因为从两个不同的唯一路径导入的同一个包实际上被认为是两个不同的唯一包,正如您所发现的。我知道govendor 默认会这样做。
  • @Kaedys +1 为州长。我在很多项目中都使用过它。
  • 扁平化供应商目录确实是一项核心滑翔功能;您能否还包括您正在使用的确切滑翔调用以及您的配置文件的样子?
  • @SamWhited 是https://github.com/orloffm/flat。它使用cat,间接使用toy。但是cat 有一些旧版本的toy 已售卖。我做glide createglide install 并得到vendor/cat/vendor/toy。

标签: go package-managers


【解决方案1】:

通过进行以下更改(还向您发送了 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/ 目录(我正在使用安装了go get -u github.com/Masterminds/glide 的glide 版本0.11.0-dev;glide install --help 显示--strip-vendor 选项)。

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

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

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

【讨论】:

  • 这样就解决了,非常感谢。与所有其他工具相比,我有点困惑。
猜你喜欢
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 2013-10-31
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多