Description
Background
In https://groups.google.com/g/golang-dev/c/j3d8zuauJoY/m/gPOgpq_5DgAJ, @griesemer noted (emphasis mine):
Not everybody has switched to modules yet. We do know from surveys that the vast majority has (we estimate some 70-80%), but it is not the default mechanism. And even if everybody was using modules, introducing these changes would require .mod files to be adjusted to avoid breakages.
I agree with that assessment. However, I think there is a better default we could use in order to move forward with less churn: rather than having the Go language version used for dependencies track the maximum version supported by the Go toolchain (as it has in the past), we should have it default to a version that is likely to be compatible with existing code that was written for use in GOPATH
mode.
Proposal
I propose that cmd/go
should:
-
If in module mode and the main module lacks an explicit language version, set it to the maximum supported language version (as
cmd/go
already does today). -
When compiling a package from a list of
.go
source files specified on the command line:- If in module mode and the working directory is inside of a module, use the main module's language version.
- If in module mode but not inside of a module, use the maximum supported language version.
- If in
GOPATH
mode, use the maximum supported language version.
-
When compiling a package, either as a direct argument to the
go
command or loaded as a dependency of some other package:- If in module mode and the module containing the package has a
go.mod
file with ago
directive, use the version indicated by that module'sgo.mod
file. - If in module mode and the module containing the package does not specify an explicit language version (perhaps because it lacks a
go.mod
file), use Go 1.14 (or another version that has not removed support for any features introduced up to that point). - If in
GOPATH
mode, use the maximum supported language version.
- If in module mode and the module containing the package has a
Note that in all cases users can explicitly override the default by passing -gcflags=-lang=…
either as an explicit argument or via GOFLAGS
.
Rationale
Defaulting to Go 1.14 for packages outside of the main module in module mode maintains compatibility for packages written prior to the introduction of modules, even when they are loaded in module mode.
Defaulting to the maximum supported language version for file lists in module mode encourages users of standalone “script” files to either keep them up to date with language changes, or explicitly record the intended version in a corresponding go.mod
file.
Defaulting to the maximum supported language version in GOPATH
mode avoids the need to (imprecisely) scan the GOPATH
tree (including vendor
directories) looking for go.mod
files, and seems the most likely to maintain compatibility for users “working at head” (which is generally what GOPATH
assumes regardless). It is also consistent with the general non-reproducibility of GOPATH
mode: if users want a reproducible build, they are encouraged to switch to module mode, and even if they do not they still have the option to set -gcflags=-lang=…
explicitly or vendor in older versions of their dependencies.
See also #30791.
Metadata
Metadata
Assignees
Type
Projects
Status