After doing some research, I decided to try
gvt since it seemed simple and well documented, and integrated well with exiting tools like
Go get target project to be updated
I’m going to update todolite-appserver to use vendored dependencies for some of it’s dependencies, just to see how things go.
I’m going to vendor the dependency on kingpin since it has transitive dependencies of it’s own (github.com/alecthomas/units, etc).
gvt handles this by automatically pulling all of the transitive dependencies.
Now my directory structure looks like this:
1 2 3 4 5 6 7
Here is the manifest
gvt list shows the following:
1 2 3 4 5
Verify it’s using the vendor folder
I opened up the
vendor/github.com/alecthomas/kingpin/global.go and made the following change:
1 2 3 4 5
Now verify that code is getting compiled and run:
1 2 3
export GO15VENDOREXPERIMENT=1 is still in effect in my shell)
Restore the dependency
Before I check in the
vendor directory to git, I want to reset it to it’s previous state before I made the above change to the
global.go source file.
Now if I open
global.go again, it’s back to it’s original state. Nice!
Add the vendor folder and push
1 2 3
Also, I updated the README to tell users to set the
1 2 3
but the instructions otherwise remained the same. If someone tries to use this but forgets to set
GO15VENDOREXPERIMENT=1 in Go 1.5, it will still work, it will just use the kingpin dependency in the
$GOPATH rather than the
vendor/ directory. Ditto for someone using go 1.4 or earlier.
Removing a vendored dependency
As it turns out, I don’t even need kingpin in this project, since I’m using cobra. The kingpin dependency was caused by some leftover code I forgot to cleanup.
To remove it, I ran:
1 2 3 4
In this case, since it was my only dependency, it was easy to identify the transitive dependencies. In general though it looks like it’s up to you as a user to track down which ones to remove. I filed gvt issue 16 to hopefully address that.
I have emacs setup using the steps in this blog post, and I’m running into the following annoyances:
- When I use
godefto jump into the code of vendored dependency, it takes me to source code that lives in the
GOPATH, which might be different than what’s under
vendor/. Also, if I edit it there, my changes won’t be reflected when I rebuild.
- I usually search for things in the project via
M-x rgrep, but now it’s searching through every repo under
vendor/and returning things I’m not interested in .. since most of the time I only want to search within my project.