2019-05-03 16:06:41 -06:00
|
|
|
Vendoring in std and cmd
|
|
|
|
========================
|
|
|
|
|
|
|
|
The Go command maintains copies of external packages needed by the
|
|
|
|
standard library in the src/vendor and src/cmd/vendor directories.
|
|
|
|
|
|
|
|
In GOPATH mode, imports of vendored packages are resolved to these
|
|
|
|
directories following normal vendor directory logic
|
|
|
|
(see golang.org/s/go15vendor).
|
|
|
|
|
|
|
|
In module mode, std and cmd are modules (defined in src/go.mod and
|
|
|
|
src/cmd/go.mod). When a package outside std or cmd is imported
|
|
|
|
by a package inside std or cmd, the import path is interpreted
|
|
|
|
as if it had a "vendor/" prefix. For example, within "crypto/tls",
|
|
|
|
an import of "golang.org/x/crypto/cryptobyte" resolves to
|
|
|
|
"vendor/golang.org/x/crypto/cryptobyte". When a package with the
|
|
|
|
same path is imported from a package outside std or cmd, it will
|
|
|
|
be resolved normally. Consequently, a binary may be built with two
|
|
|
|
copies of a package at different versions if the package is
|
|
|
|
imported normally and vendored by the standard library.
|
|
|
|
|
|
|
|
Vendored packages are internally renamed with a "vendor/" prefix
|
|
|
|
to preserve the invariant that all packages have distinct paths.
|
|
|
|
This is necessary to avoid compiler and linker conflicts. Adding
|
|
|
|
a "vendor/" prefix also maintains the invariant that standard
|
|
|
|
library packages begin with a dotless path element.
|
|
|
|
|
|
|
|
The module requirements of std and cmd do not influence version
|
|
|
|
selection in other modules. They are only considered when running
|
|
|
|
module commands like 'go get' and 'go mod vendor' from a directory
|
|
|
|
in GOROOT/src.
|
|
|
|
|
|
|
|
Maintaining vendor directories
|
|
|
|
==============================
|
|
|
|
|
|
|
|
Before updating vendor directories, ensure that module mode is enabled.
|
|
|
|
Make sure GO111MODULE=off is not set ('on' or 'auto' should work).
|
|
|
|
|
|
|
|
Requirements may be added, updated, and removed with 'go get'.
|
|
|
|
The vendor directory may be updated with 'go mod vendor'.
|
|
|
|
A typical sequence might be:
|
|
|
|
|
|
|
|
cd src
|
2019-08-23 13:24:26 -06:00
|
|
|
go get -d golang.org/x/net@latest
|
2019-05-03 16:06:41 -06:00
|
|
|
go mod tidy
|
|
|
|
go mod vendor
|
|
|
|
|
|
|
|
Use caution when passing '-u' to 'go get'. The '-u' flag updates
|
2019-08-23 13:24:26 -06:00
|
|
|
modules providing all transitively imported packages, not only
|
|
|
|
the module providing the target package.
|
2019-05-03 16:06:41 -06:00
|
|
|
|
|
|
|
Note that 'go mod vendor' only copies packages that are transitively
|
|
|
|
imported by packages in the current module. If a new package is needed,
|
|
|
|
it should be imported before running 'go mod vendor'.
|