| 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. | |
| There are two modules, std and cmd, 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 that GO111MODULE is not set in the environment, or that it is | |
| set to 'on' or 'auto', and if you use a go.work file, set GOWORK=off. | |
| Also, ensure that 'go env GOROOT' shows the root of this Go source | |
| tree. Otherwise, the results are undefined. It's recommended to build | |
| Go from source and use that 'go' binary to update its source tree. | |
| Requirements may be added, updated, and removed with 'go get'. | |
| The vendor directory may be updated with 'go mod vendor'. | |
| Tree inconsistencies are reported by 'go test cmd/internal/moddeps'. | |
| A typical sequence might be: | |
| cd src # or src/cmd | |
| GOPROXY=direct go get golang.org/x/net@master | |
| go mod tidy | |
| go mod vendor | |
| go test cmd/internal/moddeps | |
| 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'. | |
| Go release cycle considerations | |
| =============================== | |
| Applying changes to packages that are vendored follows the considerations | |
| written down at go.dev/s/release. | |
| When the Go tree is open for development, a specific change may be pulled in | |
| at any time that it is needed. During the release freeze, the bar for changes | |
| in vendored packages is the same as it is for changes in non-vendored packages. | |
| After a major release is out, minor Go releases follow a more involved process | |
| documented at go.dev/wiki/MinorReleases#cherry-pick-cls-for-vendored-golangorgx-packages. | |
| In addition to individual updates that happen on demand, all dependencies in | |
| the std and cmd modules are updated to their latest available versions at least | |
| twice during every major release cycle. This is done to avoid the possibility of | |
| some dependencies being left on very old versions and in turn make their eventual | |
| update more disruptive. This recurring process is tracked in go.dev/issue/36905. | |
| The golang.org/x/build/cmd/updatestd command exists to assist with that process. |