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