|  | 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 | 
|  | go get -d golang.org/x/net@latest | 
|  | go mod tidy | 
|  | go mod vendor | 
|  |  | 
|  | Use caution when passing '-u' to 'go get'. The '-u' flag updates | 
|  | modules providing all transitively imported packages, not only | 
|  | the module providing the target package. | 
|  |  | 
|  | 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'. |