govendorcan specify build tags to ignore when vendoring
- But, files necessary for build may not be copied under the vendor directory
- Problems such as failure to cross-compile may occur by not copying necessary files
- So, the size of the vendor directory may increase, but it is simpler not to use filtering by build tags
Currently, golang has many package management tools as following:
Many other tools are also introduced on this page.
Among them, I often use
govendor is very easy to use, I use it in many projects.
However, there was a problem depending on the setting of
What is the problem?
Last month , I made a following PullRequest to Terraform.
This PR is for adding Arukas provider.
This new provider was already released separately from Terraform as the following third-party-plugin.
This PR was immediately merged and released in Terraform v0.8.3.
But, at that time,,,
Build on Windows broke!!!
What's!? What's happened!?!?
The Arukas provider release as a third-party-plugin included the Windows version, and it was able to build without any problems.
From that time on, the source code has not changed at all, why has the build broken?
Who broke the build on Windows?
I looked for
gopkg.in/alecthomas/kingpin.v2 which was in the message from @jbardin.
gopkg.in/alecthomas/kingpin.v2 is a library imported by the Arukas provider.
This library has been used since Arukas provider was released as a third-party-plugin, so I know that it is compatible with Windows.
And, both Terraform and the Arukas provider as a third-party-plugin use
govendor for vendoring.
So I decided to compare the files of
gopkg.in/alecthomas/kingpin.v2 library copied under vendor directory(that was copied by
gopkg.in/alecthomas/kingpin.v2 files under vendor directory
The following screen shot shows the comparison result.
It seems that
guesswidth.go has not been copied for some reason.
govendor was setted to ignore some build tags
govendor configuration file
vendor/vendor.json has the following setting:
"ignore": "appengine test",
govendor compares the value set in ignore in
vendor/vendor.json with the file name suffix or build tags to determine if it is the target file to ignore.
In this case
appengine are specified as ignore targets.
And, the build tag of the missing file
guesswidth.go is as follows:
// +build appengine !linux,!freebsd,!darwin,!dragonfly,!netbsd,!openbsd
In case of *nix platform,
guesswidth_unix.go is used instead of this file.
It has the following build tags:
// +build !appengine,linux freebsd darwin dragonfly netbsd openbsd
With these build tags, the
guesswidth.go file is used when building on Windows.
appengine is specified in ignore in
In this way, you can build with *nix but not build on Windows,,,
So what should we do?
Filtering by build tag has the advantage of being able to reduce the size of the vendor directory, but problems such as being unable to build in some platforms may occur.
In addition, troublesome work such as checking the build tag of individual files to be imported will occur to solve the problem.
For these reason, filtering by build tag should not be used when vendoring.
(Note: I think filtering works well only for "test" and "ignore" tags)
What is a use case that requires filtering when vendoring? I don't have it.
What do you think?
If you have a nice way please comment to this post!