I'm writing an application and import some package B. This package has the vendor directory inside which, in turn, contains package C. I also want to use that package C in my app directly.
So I decided to use glide package manager. It downloads both B and C into myapp/vendor directory, but keeps myapp/vendor/B/vendor/C inside. So when I build my app, it builds with two different versions of C (also with myapp/vendor/C).
How to avoid that?
1) Either, is there a package manager that handles that? govend seems to with its --prune argument, but it doesn't respect the versions of these C packages.
2) Or, how to make glide properly handle the nested vendor directories?
Edit
My example is https://github.com/orloffm/flat. It uses cat and - indirectly - toy packages. cat has some older version of toy vendored and commited into repository. I do glide create && glide install and end up with this:
.
├── 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
I don't want to have nested vendor directory with toy.
I was able to install and run your flat program by making the following changes (also sent you a PR https://github.com/orloffm/flat/pull/1):
1) flat.go needs to import "github.com/orloffm/toy" because of new(toy.RubberToy) - otherwise it doesn't compile
2) add glide.yaml file that list both "cat" and "toy" libraries as dependencies:
package: github.com/orloffm/flat
import:
- package: github.com/orloffm/cat
- package: github.com/orloffm/toy
3) run glide install --strip-vcs --strip-vendor (or the equivalent shortcut glide install -s -v) to install packages and remove nested vendor/ directories (I'm using glide version 0.11.0-dev installed with go get -u github.com/Masterminds/glide; glide install --help shows the --strip-vendor option).
4) GOBIN=$PWD go install && ./flat produces
Cat pushes the toy.
The toy makes a very loud noise.
I think the best would be not to include the vendor directory into your libraries - this messes things up and makes life more difficult for the library users (for example, need to remember to use additional options to glide). Let the "clients" of those libraries - package main packages - either to vendor all the dependencies (including transitive ones) or specify them in a configuration such as glide.yaml and let the tool (glide) to fetch and install them properly.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With