如何处理 Go 包中嵌套的 "vendor" 目录?
How to handle nested "vendor" directories in Go packages?
我正在编写一个应用程序并导入一些包 B
。这个包有 vendor
目录,里面又包含包 C
。我也想直接在我的应用程序中使用那个包 C
。
所以我决定使用 glide
包管理器。它将 B
和 C
下载到 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/glide
;glide 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
并让工具(滑动)到获取并正确安装它们。
我正在编写一个应用程序并导入一些包 B
。这个包有 vendor
目录,里面又包含包 C
。我也想直接在我的应用程序中使用那个包 C
。
所以我决定使用 glide
包管理器。它将 B
和 C
下载到 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/glide
;glide 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
并让工具(滑动)到获取并正确安装它们。