blob: 25655a7e0fca0fb0baf4c6342bf547708655c46c [file] [view]
<!--{
"Title": "Go Modules Reference",
"Subtitle": "Version of Feb 5, 2019",
"Path": "/ref/mod"
}-->
<!-- TODO(jayconrod): change anchors to header id attributes either during
markdown rendering or as HTML postprocessing step. -->
<!-- TODO(jayconrod): use <dfn> tags where meaningful.
Currently, *term* is used instead, which renders to <em>term</em>. -->
<a id="introduction"></a>
## Introduction
<a id="modules-overview"></a>
## Modules, packages, and versions
A [*module*](#glos-module) is a collection of packages that are released,
versioned, and distributed together. A module is identified by a [*module
path*](#glos-module-path), which is declared in a [`go.mod`
file](#go.mod-files), together with information about the module's
dependencies. The [*module root directory*](#glos-module-root-directory) is the
directory that contains the `go.mod` file. The [*main
module*](#glos-main-module) is the module containing the directory where the
`go` command is invoked.
Each [*package*](#glos-package) within a module is a collection of source files
in the same directory that are compiled together. A [*package
path*](#glos-package-path) is the module path joined with the subdirectory
containing the package (relative to the module root). For example, the module
`"golang.org/x/net"` contains a package in the directory `"html"`. That
package's path is `"golang.org/x/net/html"`.
<a id="module-path"></a>
### Module paths
A [*module path*](#glos-module-path) is the canonical name for a module,
declared with the [`module` directive](#go.mod-module) in the module's
[`go.mod` file](#glos-go.mod-file). A module's path is the prefix for package
paths within the module.
A module path should describe both what the module does and where to find it.
Typically, a module path consists of a repository root path, a directory within
the repository (usually empty), and a major version suffix (only for major
version 2 or higher).
* The <dfn>repository root path</dfn> is the portion of the module path that
corresponds to the root directory of the version control repository where the
module is developed. Most modules are defined in their repository's root
directory, so this is usually the entire path. For example,
`golang.org/x/net` is the repository root path for the module of the same
name. See [Finding a repository for a module path](#vcs-find) for information
on how the `go` command locates a repository using HTTP requests derived
from a module path.
* If the module is not defined in the repository's root directory, the
<dfn>module subdirectory</dfn> is the part of the module path that names the
directory, not including the major version suffix. This also serves as a
prefix for semantic version tags. For example, the module
`golang.org/x/tools/gopls` is in the `gopls` subdirectory of the repository
with root path `golang.org/x/tools`, so it has the module subdirectory
`gopls`. See [Mapping versions to commits](#vcs-version) and [Module
directories within a repository](#vcs-dir).
* If the module is released at major version 2 or higher, the module path must
end with a [*major version suffix*](#major-version-suffixes) like
`/v2`. This may or may not be part of the subdirectory name. For example, the
module with path `golang.org/x/repo/sub/v2` could be in the `/sub` or
`/sub/v2` subdirectory of the repository `golang.org/x/repo`.
If a module might be depended on by other modules, these rules must be followed
so that the `go` command can find and download the module. There are also
several [lexical restrictions](#go.mod-ident) on characters allowed in
module paths.
<a id="versions"></a>
### Versions
A [*version*](#glos-version) identifies an immutable snapshot of a module, which
may be either a [release](#glos-release-version) or a
[pre-release](#glos-pre-release-version). Each version starts with the letter
`v`, followed by a semantic version. See [Semantic Versioning
2.0.0](https://semver.org/spec/v2.0.0.html) for details on how versions are
formatted, interpreted, and compared.
To summarize, a semantic version consists of three non-negative integers (the
major, minor, and patch versions, from left to right) separated by dots. The
patch version may be followed by an optional pre-release string starting with a
hyphen. The pre-release string or patch version may be followed by a build
metadata string starting with a plus. For example, `v0.0.0`, `v1.12.134`,
`v8.0.5-pre`, and `v2.0.9+meta` are valid versions.
Each part of a version indicates whether the version is stable and whether it is
compatible with previous versions.
* The [major version](#glos-major-version) must be incremented and the minor
and patch versions must be set to zero after a backwards incompatible change
is made to the module's public interface or documented functionality, for
example, after a package is removed.
* The [minor version](#glos-minor-version) must be incremented and the patch
version set to zero after a backwards compatible change, for example, after a
new function is added.
* The [patch version](#glos-patch-version) must be incremented after a change
that does not affect the module's public interface, such as a bug fix or
optimization.
* The pre-release suffix indicates a version is a
[pre-release](#glos-pre-release-version). Pre-release versions sort before
the corresponding release versions. For example, `v1.2.3-pre` comes before
`v1.2.3`.
* The build metadata suffix is ignored for the purpose of comparing versions.
Tags with build metadata are ignored in version control repositories, but
build metadata is preserved in versions specified in `go.mod` files. The
suffix `+incompatible` denotes a version released before migrating to modules
version major version 2 or later (see [Compatibility with non-module
repositories](#non-module-compat).
A version is considered unstable if its major version is 0 or it has a
pre-release suffix. Unstable versions are not subject to compatibility
requirements. For example, `v0.2.0` may not be compatible with `v0.1.0`, and
`v1.5.0-beta` may not be compatible with `v1.5.0`.
Go may access modules in version control systems using tags, branches, or
revisions that don't follow these conventions. However, within the main module,
the `go` command will automatically convert revision names that don't follow
this standard into canonical versions. The `go` command will also remove build
metadata suffixes (except for `+incompatible`) as part of this process. This may
result in a [*pseudo-version*](#glos-pseudo-version), a pre-release version that
encodes a revision identifier (such as a Git commit hash) and a timestamp from a
version control system. For example, the command `go get -d
golang.org/x/net@daa7c041` will convert the commit hash `daa7c041` into the
pseudo-version `v0.0.0-20191109021931-daa7c04131f5`. Canonical versions are
required outside the main module, and the `go` command will report an error if a
non-canonical version like `master` appears in a `go.mod` file.
<a id="pseudo-versions"></a>
### Pseudo-versions
A <dfn>pseudo-version</dfn> is a specially formatted
[pre-release](#glos-pre-release-version) [version](#glos-version) that encodes
information about a specific revision in a version control repository. For
example, `v0.0.0-20191109021931-daa7c04131f5` is a pseudo-version.
Pseudo-versions are used to refer to revisions for which no [semantic version
tags](#glos-semantic-version-tag) are available. They may be used to test
commits before creating version tags, for example, on a development branch.
Each pseudo-version has three parts:
* A base version (`vX.Y.Z`), which refers to a version before the revision
described by the pseudo-version or `vX.0.0` if there is no such version.
* A timestamp (`yymmddhhmmss`), which is the UTC time the revision was created.
In Git, this is the commit time, not the author time.
* A revision identifier (`abcdefabcdef`), which is a 12-character prefix of the
commit hash, or in Subversion, a zero-padded revision number.
Each pseudo-version may be in one of three forms, depending on the base version.
These forms ensure that a pseudo-version compares higher than its base version,
but lower than the next tagged version.
* `vX.0.0-yyyymmddhhmmss-abcdefabcdef` is used when there is no known base
version. As with all versions, the major version `X` must match the module's
[major version suffix](#glos-major-version-suffix).
* `vX.Y.Z-pre.0.yyyymmddhhmmss-abcdefabcdef` is used when the base version is
a pre-release version like `vX.Y.Z-pre`.
* `vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdefabcdef` is used when the base version is
a release version like `vX.Y.Z`. For example, if the base version is
`v1.2.3`, a pseudo-version might be `v1.2.4-0.20191109021931-daa7c04131f5`.
More than one pseudo-version may refer to the same commit by using different
base versions. This happens naturally when a lower version is tagged after a
pseudo-version is written.
The `go` command performs several checks to ensure that module authors have
control over how pseudo-versions are compared with other versions and that
pseudo-versions refer to revisions that are actually part of a module's
commit history.
* If a base version is specified, there must be a corresponding semantic version
tag that is an ancestor of the revision described by the pseudo-version. This
prevents developers from bypassing [minimal version
selection](#glos-minimal-version-selection) using a pseudo-version that
compares higher than all tagged versions like
`v1.999.999-99999999999999-daa7c04131f5`.
* The timestamp must match the revision's timestamp. This prevents attackers
from flooding [module proxies](#glos-module-proxy) with an unbounded number
of pseudo-versions that refer to the same revision.
* The revision must be an ancestor of one of the module repository's branches.
This prevents attackers from referring to unapproved changes or pull requests.
Pseudo-versions never need to be typed by hand. Many commands accept
a commit hash or a branch name and will translate it into a pseudo-version
(or tagged version if available) automatically. For example:
```
go get -d example.com/mod@master
go list -m -json example.com/mod@abcd1234
```
<a id="major-version-suffixes"></a>
### Major version suffixes
Starting with major version 2, module paths must have a [*major version
suffix*](#glos-major-version-suffix) like `/v2` that matches the major
version. For example, if a module has the path `example.com/mod` at `v1.0.0`, it
must have the path `example.com/mod/v2` at version `v2.0.0`.
Major version suffixes implement the [*import compatibility
rule*](https://research.swtch.com/vgo-import):
> If an old package and a new package have the same import path,
> the new package must be backwards compatible with the old package.
By definition, packages in a new major version of a module are not backwards
compatible with the corresponding packages in the previous major version.
Consequently, starting with `v2`, packages need new import paths. This is
accomplished by adding a major version suffix to the module path. Since the
module path is a prefix of the import path for each package within the module,
adding the major version suffix to the module path provides a distinct import
path for each incompatible version.
Major version suffixes are not allowed at major versions `v0` or `v1`. There is
no need to change the module path between `v0` and `v1` because `v0` versions
are unstable and have no compatibility guarantee. Additionally, for most
modules, `v1` is backwards compatible with the last `v0` version; a `v1` version
acts as a commitment to compatibility, rather than an indication of
incompatible changes compared with `v0`.
As a special case, modules paths starting with `gopkg.in/` must always have a
major version suffix, even at `v0` and `v1`. The suffix must start with a dot
rather than a slash (for example, `gopkg.in/yaml.v2`).
Major version suffixes let multiple major versions of a module coexist in the
same build. This may be necessary due to a [diamond dependency
problem](https://research.swtch.com/vgo-import#dependency_story). Ordinarily, if
a module is required at two different versions by transitive dependencies, the
higher version will be used. However, if the two versions are incompatible,
neither version will satisfy all clients. Since incompatible versions must have
different major version numbers, they must also have different module paths due
to major version suffixes. This resolves the conflict: modules with distinct
suffixes are treated as separate modules, and their packages—even packages in
same subdirectory relative to their module roots—are distinct.
Many Go projects released versions at `v2` or higher without using a major
version suffix before migrating to modules (perhaps before modules were even
introduced). These versions are annotated with a `+incompatible` build tag (for
example, `v2.0.0+incompatible`). See [Compatibility with non-module
repositories](#non-module-compat) for more information.
<a id="resolve-pkg-mod"></a>
### Resolving a package to a module
When the `go` command loads a package using a [package
path](#glos-package-path), it needs to determine which module provides the
package.
The `go` command starts by searching the [build list](#glos-build-list) for
modules with paths that are prefixes of the package path. For example, if the
package `example.com/a/b` is imported, and the module `example.com/a` is in the
build list, the `go` command will check whether `example.com/a` contains the
package, in the directory `b`. At least one file with the `.go` extension must
be present in a directory for it to be considered a package. [Build
constraints](/pkg/go/build/#hdr-Build_Constraints) are not applied for this
purpose. If exactly one module in the build list provides the package, that
module is used. If two or more modules provide the package, an error is
reported. If no modules provide the package, the `go` command will attempt to
find a new module (unless the flags `-mod=readonly` or `-mod=vendor` are used,
in which case, an error is reported).
<!-- NOTE(golang.org/issue/27899): the go command reports an error when two
or more modules provide a package with the same path as above. In the future,
we may try to upgrade one (or all) of the colliding modules.
-->
When the `go` command looks up a new module for a package path, it checks the
`GOPROXY` environment variable, which is a comma-separated list of proxy URLs or
the keywords `direct` or `off`. A proxy URL indicates the `go` command should
contact a [module proxy](#glos-module-proxy) using the [`GOPROXY`
protocol](#goproxy-protocol). `direct` indicates that the `go` command should
[communicate with a version control system](#vcs). `off` indicates that no
communication should be attempted. The `GOPRIVATE` and `GONOPROXY` [environment
variables](#environment-variables) can also be used to control this behavior.
For each entry in the `GOPROXY` list, the `go` command requests the latest
version of each module path that might provide the package (that is, each prefix
of the package path). For each successfully requested module path, the `go`
command will download the module at the latest version and check whether the
module contains the requested package. If one or more modules contain the
requested package, the module with the longest path is used. If one or more
modules are found but none contain the requested package, an error is
reported. If no modules are found, the `go` command tries the next entry in the
`GOPROXY` list. If no entries are left, an error is reported.
For example, suppose the `go` command is looking for a module that provides the
package `golang.org/x/net/html`, and `GOPROXY` is set to
`https://corp.example.com,https://proxy.golang.org`. The `go` command may make
the following requests:
* To `https://corp.example.com/` (in parallel):
* Request for latest version of `golang.org/x/net/html`
* Request for latest version of `golang.org/x/net`
* Request for latest version of `golang.org/x`
* Request for latest version of `golang.org`
* To `https://proxy.golang.org/`, if all requests to `https://corp.example.com/`
have failed with 404 or 410:
* Request for latest version of `golang.org/x/net/html`
* Request for latest version of `golang.org/x/net`
* Request for latest version of `golang.org/x`
* Request for latest version of `golang.org`
After a suitable module has been found, the `go` command will add a new
[requirement](#go.mod-require) with the new module's path and version to the
main module's `go.mod` file. This ensures that when the same package is loaded
in the future, the same module will be used at the same version. If the resolved
package is not imported by a package in the main module, the new requirement
will have an `// indirect` comment.
<a id="go.mod-files"></a>
## `go.mod` files
A module is defined by a UTF-8 encoded text file named `go.mod` in its root
directory. The `go.mod` file is line-oriented. Each line holds a single
directive, made up of a keyword followed by arguments. For example:
```
module example.com/my/thing
go 1.12
require example.com/other/thing v1.0.2
require example.com/new/thing/v2 v2.3.4
exclude example.com/old/thing v1.2.3
replace example.com/bad/thing v1.4.5 => example.com/good/thing v1.4.5
```
The leading keyword can be factored out of adjacent lines to create a block,
like in Go imports.
```
require (
example.com/new/thing/v2 v2.3.4
example.com/old/thing v1.2.3
)
```
The `go.mod` file is designed to be human readable and machine writable. The
`go` command provides several subcommands that change `go.mod` files. For
example, [`go get`](#go-get) can upgrade or downgrade specific dependencies.
Commands that load the module graph will [automatically update](#go.mod-updates)
`go.mod` when needed. [`go mod edit`](#go-mod-tidy) can perform low-level edits.
The
[`golang.org/x/mod/modfile`](https://pkg.go.dev/golang.org/x/mod/modfile?tab=doc)
package can be used by Go programs to make the same changes programmatically.
<a id="go.mod-lexical"></a>
### Lexical elements
When a `go.mod` file is parsed, its content is broken into a sequence of tokens.
There are several kinds of tokens: whitespace, comments, punctuation,
keywords, identifiers, and strings.
*White space* consists of spaces (U+0020), tabs (U+0009), carriage returns
(U+000D), and newlines (U+000A). White space characters other than newlines have
no effect except to separate tokens that would otherwise be combined. Newlines
are significant tokens.
*Comments* start with `//` and run to the end of a line. `/* */` comments are
not allowed.
*Punctuation* tokens include `(`, `)`, and `=>`.
*Keywords* distinguish different kinds of directives in a `go.mod` file. Allowed
keywords are `module`, `go`, `require`, `replace`, and `exclude`.
*Identifiers* are sequences of non-whitespace characters, such as module paths
or semantic versions.
*Strings* are quoted sequences of characters. There are two kinds of strings:
interpreted strings beginning and ending with quotation marks (`"`, U+0022) and
raw strings beginning and ending with grave accents (<code>&#60;</code>,
U+0060). Interpreted strings may contain escape sequences consisting of a
backslash (`\`, U+005C) followed by another character. An escaped quotation
mark (`\"`) does not terminate an interpreted string. The unquoted value
of an interpreted string is the sequence of characters between quotation
marks with each escape sequence replaced by the character following the
backslash (for example, `\"` is replaced by `"`, `\n` is replaced by `n`).
In contrast, the unquoted value of a raw string is simply the sequence of
characters between grave accents; backslashes have no special meaning within
raw strings.
Identifiers and strings are interchangeable in the `go.mod` grammar.
<a id="go.mod-ident"></a>
### Module paths and versions
Most identifiers and strings in a `go.mod` file are either module paths or
versions.
A module path must satisfy the following requirements:
* The path must consist of one or more path elements separated by slashes
(`/`, U+002F). It must not begin or end with a slash.
* Each path element is a non-empty string made of up ASCII letters, ASCII
digits, and limited ASCII punctuation (`+`, `-`, `.`, `_`, and `~`).
* A path element may not begin or end with a dot (`.`, U+002E).
* The element prefix up to the first dot must not be a reserved file name on
Windows, regardless of case (`CON`, `com1`, `NuL`, and so on).
If the module path appears in a `require` directive and is not replaced, or
if the module paths appears on the right side of a `replace` directive,
the `go` command may need to download modules with that path, and some
additional requirements must be satisfied.
* The leading path element (up to the first slash, if any), by convention a
domain name, must contain only lower-case ASCII letters, ASCII digits, dots
(`.`, U+002E), and dashes (`-`, U+002D); it must contain at least one dot and
cannot start with a dash.
* For a final path element of the form `/vN` where `N` looks numeric (ASCII
digits and dots), `N` must not begin with a leading zero, must not be `/v1`,
and must not contain any dots.
* For paths beginning with `gopkg.in/`, this requirement is replaced by a
requirement that the path follow the [gopkg.in](https://gopkg.in) service's
conventions.
Versions in `go.mod` files may be [canonical](#glos-canonical-version) or
non-canonical.
A canonical version starts with the letter `v`, followed by a semantic version
following the [Semantic Versioning 2.0.0](https://semver.org/spec/v2.0.0.html)
specification. See [Versions](#versions) for more information.
Most other identifiers and strings may be used as non-canonical versions, though
there are some restrictions to avoid problems with file systems, repositories,
and [module proxies](#glos-module-proxy). Non-canonical versions are only
allowed in the main module's `go.mod` file. The `go` command will attempt to
replace each non-canonical version with an equivalent canonical version when it
automatically [updates](#go.mod-updates) the `go.mod` file.
In places where a module path is associated with a verison (as in `require`,
`replace`, and `exclude` directives), the final path element must be consistent
with the version. See [Major version suffixes](#major-version-suffixes).
<a id="go.mod-grammar"></a>
### Grammar
`go.mod` syntax is specified below using Extended Backus-Naur Form (EBNF).
See the [Notation section in the Go Language Specificiation](/ref/spec#Notation)
for details on EBNF syntax.
```
GoMod = { Directive } .
Directive = ModuleDirective |
GoDirective |
RequireDirective |
ExcludeDirective |
ReplaceDirective .
```
Newlines, identifiers, and strings are denoted with `newline`, `ident`, and
`string`, respectively.
Module paths and versions are denoted with `ModulePath` and `Version`.
```
ModulePath = ident | string . /* see restrictions above */
Version = ident | string . /* see restrictions above */
```
<a id="go.mod-module"></a>
### `module` directive
A `module` directive defines the main module's [path](#glos-module-path). A
`go.mod` file must contain exactly one `module` directive.
```
ModuleDirective = "module" ( ModulePath | "(" newline ModulePath newline ")" newline .
```
Example:
```
module golang.org/x/net
```
<a id="go.mod-go"></a>
### `go` directive
A `go` directive sets the expected language version for the module. The
version must be a valid Go release version: a positive integer followed by a dot
and a non-negative integer (for example, `1.9`, `1.14`).
The language version determines which language features are available when
compiling packages in the module. Language features present in that version
will be available for use. Language features removed in earlier versions,
or added in later versions, will not be available. The language version does not
affect build tags, which are determined by the Go release being used.
The language version is also used to enable features in the `go` command. For
example, automatic [vendoring](#vendoring) may be enabled with a `go` version of
`1.14` or higher.
A `go.mod` file may contain at most one `go` directive. Most commands will add a
`go` directive with the current Go version if one is not present.
```
GoDirective = "go" GoVersion newline .
GoVersion = string | ident . /* valid release version; see above */
```
Example:
```
go 1.14
```
<a id="go.mod-require"></a>
### `require` directive
A `require` directive declares a minimum required version of a given module
dependency. For each required module version, the `go` command loads the
`go.mod` file for that version and incorporates the requirements from that
file. Once all requirements have been loaded, the `go` command resolves them
using [minimal version selection (MVS)](#minimal-version-selection) to produce
the [build list](#glos-build-list).
The `go` command automatically adds `// indirect` comments for some
requirements. An `// indirect` comment indicates that no package from the
required module is directly imported by any package in the main module.
The `go` command adds an indirect requirement when the selected version of a
module is higher than what is already implied (transitively) by the main
module's other dependencies. That may occur because of an explicit upgrade
(`go get -u`), removal of some other dependency that previously imposed the
requirement (`go mod tidy`), or a dependency that imports a package without
a corresponding requirement in its own `go.mod` file (such as a dependency
that lacks a `go.mod` file altogether).
```
RequireDirective = "require" ( RequireSpec | "(" newline { RequireSpec } ")" newline ) .
RequireSpec = ModulePath Version newline .
```
Example:
```
require golang.org/x/net v1.2.3
require (
golang.org/x/crypto v1.4.5 // indirect
golang.org/x/text v1.6.7
)
```
<a id="go.mod-exclude"></a>
### `exclude` directive
An `exclude` directive prevents a module version from being loaded by the `go`
command. If an excluded version is referenced by a `require` directive in a
`go.mod` file, the `go` command will list available versions for the module (as
shown with `go list -m -versions`) and will load the next higher non-excluded
version instead. Both release and pre-release versions are considered for this
purpose, but pseudo-versions are not. If there are no higher versions,
the `go` command will report an error. Note that this [may
change](https://golang.org/issue/36465) in Go 1.15.
<!-- TODO(golang.org/issue/36465): update after change -->
`exclude` directives only apply in the main module's `go.mod` file and are
ignored in other modules. See [Minimal version
selection](#minimal-version-selection) for details.
```
ExcludeDirective = "exclude" ( ExcludeSpec | "(" newline { ExcludeSpec } ")" ) .
ExcludeSpec = ModulePath Version newline .
```
Example:
```
exclude golang.org/x/net v1.2.3
exclude (
golang.org/x/crypto v1.4.5
golang.org/x/text v1.6.7
)
```
<a id="go.mod-replace"></a>
### `replace` directive
A `replace` directive replaces the contents of a specific version of a module,
or all versions of a module, with contents found elsewhere. The replacement
may be specified with either another module path and version, or a
platform-specific file path.
If a version is present on the left side of the arrow (`=>`), only that specific
version of the module is replaced; other versions will be accessed normally.
If the left version is omitted, all versions of the module are replaced.
If the path on the right side of the arrow is an absolute or relative path
(beginning with `./` or `../`), it is interpreted as the local file path to the
replacement module root directory, which must contain a `go.mod` file. The
replacement version must be omitted in this case.
If the path on the right side is not a local path, it must be a valid module
path. In this case, a version is required. The same module version must not
also appear in the build list.
Regardless of whether a replacement is specified with a local path or module
path, if the replacement module has a `go.mod` file, its `module` directive
must match the module path it replaces.
`replace` directives only apply in the main module's `go.mod` file
and are ignored in other modules. See [Minimal version
selection](#minimal-version-selection) for details.
```
ReplaceDirective = "replace" ( ReplaceSpec | "(" newline { ReplaceSpec } ")" newline ")" ) .
ReplaceSpec = ModulePath [ Version ] "=>" FilePath newline
| ModulePath [ Version ] "=>" ModulePath Version newline .
FilePath = /* platform-specific relative or absolute file path */
```
Example:
```
replace golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5
replace (
golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5
golang.org/x/net => example.com/fork/net v1.4.5
golang.org/x/net v1.2.3 => ./fork/net
golang.org/x/net => ./fork/net
)
```
<a id="go.mod-updates"></a>
### Automatic updates
The `go` command automatically updates `go.mod` when it uses the module graph if
some information is missing or `go.mod` doesn't accurately reflect reality. For
example, consider this `go.mod` file:
```
module example.com/M
require (
example.com/A v1
example.com/B v1.0.0
example.com/C v1.0.0
example.com/D v1.2.3
example.com/E dev
)
exclude example.com/D v1.2.3
```
The update rewrites non-canonical version identifiers to
[canonical](#glos-canonical-version) semver form, so `example.com/A`'s `v1`
becomes `v1.0.0`, and `example.com/E`'s `dev` becomes the pseudo-version for the
latest commit on the `dev` branch, perhaps `v0.0.0-20180523231146-b3f5c0f6e5f1`.
The update modifies requirements to respect exclusions, so the requirement on
the excluded `example.com/D v1.2.3` is updated to use the next available version
of `example.com/D`, perhaps `v1.2.4` or `v1.3.0`.
The update removes redundant or misleading requirements. For example, if
`example.com/A v1.0.0` itself requires `example.com/B v1.2.0` and `example.com/C
v1.0.0`, then `go.mod`'s requirement of `example.com/B v1.0.0` is misleading
(superseded by `example.com/A`'s need for `v1.2.0`), and its requirement of
`example.com/C v1.0.0` is redundant (implied by `example.com/A`'s need for the
same version), so both will be removed. If the main module contains packages
that directly import packages from `example.com/B` or `example.com/C`, then the
requirements will be kept but updated to the actual versions being used.
Finally, the update reformats the `go.mod` in a canonical formatting, so
that future mechanical changes will result in minimal diffs. The `go` command
will not update `go.mod` if only formatting changes are needed.
Because the module graph defines the meaning of import statements, any commands
that load packages also use and therefore update `go.mod`, including `go build`,
`go get`, `go install`, `go list`, `go test`, `go mod graph`, `go mod tidy`, and
`go mod why`.
The `-mod=readonly` flag prevents commands from automatically updating
`go.mod`. However, if a command needs to perform an action that would
update to `go.mod`, it will report an error. For example, if
`go build` is asked to build a package not provided by any module in the build
list, `go build` will report an error instead of looking up the module and
updating requirements in `go.mod`.
<a id="minimal-version-selection"></a>
## Minimal version selection (MVS)
<a id="non-module-compat"></a>
## Compatibility with non-module repositories
<!-- TODO(jayconrod):
* Synthesized go.mod file in root directory.
* +incompatible
* Minimal module compatibility.
-->
<a id="mod-commands"></a>
## Module-aware commands
Most `go` commands may run in *Module-aware mode* or *`GOPATH` mode*. In
module-aware mode, the `go` command uses `go.mod` files to find versioned
dependencies, and it typically loads packages out of the [module
cache](#glos-module-cache), downloading modules if they are missing. In `GOPATH`
mode, the `go` command ignores modules; it looks in `vendor` directories and in
`GOPATH` to find dependencies.
Module-aware mode is active by default whenever a `go.mod` file is found in the
current directory or in any parent directory. For more fine-grained control, the
`GO111MODULE` environment variable may be set to one of three values: `on`,
`off`, or `auto`.
* If `GO111MODULE=off`, the `go` command ignores `go.mod` files and runs in
`GOPATH` mode.
* If `GO111MODULE=on`, the `go` command runs in module-aware mode, even when
no `go.mod` file is present. Not all commands work without a `go.mod` file:
see [Module commands outside a module](#commands-outside).
* If `GO111MODULE=auto` or is unset, the `go` command runs in module-aware
mode if a `go.mod` file is present in the current directory or any parent
directory (the default behavior).
In module-aware mode, `GOPATH` no longer defines the meaning of imports during a
build, but it still stores downloaded dependencies (in `GOPATH/pkg/mod`; see
[Module cache](#module-cache)) and installed commands (in `GOPATH/bin`, unless
`GOBIN` is set).
<a id="build-commands"></a>
### Build commands
<a id="vendoring"></a>
### Vendoring
When using modules, the `go` command typically satisfies dependencies by
downloading modules from their sources into the module cache, then loading
packages from those downloaded copies. *Vendoring* may be used to allow
interoperation with older versions of Go, or to ensure that all files used for a
build are stored in a single file tree.
The `go mod vendor` command constructs a directory named `vendor` in the [main
module's](#glos-main-module) root directory containing copies of all packages
needed to build and test packages in the main module. Packages that are only
imported by tests of packages outside the main module are not included. As with
[`go mod tidy`](#go-mod-tidy) and other module commands, [build
constraints](#glos-build-constraint) except for `ignore` are not considered when
constructing the `vendor` directory.
`go mod vendor` also creates the file `vendor/modules.txt` that contains a list
of vendored packages and the module versions they were copied from. When
vendoring is enabled, this manifest is used as a source of module version
information, as reported by [`go list -m`](#go-list-m) and [`go version
-m`](#go-version-m). When the `go` command reads `vendor/modules.txt`, it checks
that the module versions are consistent with `go.mod`. If `go.mod` has changed
since `vendor/modules.txt` was generated, the `go` command will report an error.
`go mod vendor` should be run again to update the `vendor` directory.
If the `vendor` directory is present in the main module's root directory, it
will be used automatically if the [`go` version](#go.mod-go) in the main
module's [`go.mod` file](#glos-go.mod-file) is `1.14` or higher. To explicitly
enable vendoring, invoke the `go` command with the flag `-mod=vendor`. To
disable vendoring, use the flag `-mod=mod`.
When vendoring is enabled, [build commands](#build-commands) like `go build` and
`go test` load packages from the `vendor` directory instead of accessing the
network or the local module cache. The [`go list -m`](#go-list-m) command only
prints information about modules listed in `go.mod`. `go mod` commands such as
[`go mod download`](#go-mod-download) and [`go mod tidy`](#go-mod-tidy) do not
work differently when vendoring is enabled and will still download modules and
access the module cache. [`go get`](#go-get) also does not work differently when
vendoring is enabled.
Unlike [vendoring in `GOPATH`](https://golang.org/s/go15vendor), the `go`
command ignores vendor directories in locations other than the main module's
root directory.
<a id="go-get"></a>
### `go get`
Usage:
```
go get [-d] [-t] [-u] [build flags] [packages]
```
Examples:
```
# Install the latest version of a tool.
$ go get golang.org/x/tools/cmd/goimports
# Upgrade a specific module.
$ go get -d golang.org/x/net
# Upgrade modules that provide packages imported by package in the main module.
$ go get -u ./...
# Upgrade or downgrade to a specific version of a module.
$ go get -d golang.org/x/text@v0.3.2
# Update to the commit on the module's master branch.
$ go get -d golang.org/x/text@master
# Remove a dependency on a module and downgrade modules that require it
# to versions that don't require it.
$ go get -d golang.org/x/text@none
```
The `go get` command updates module dependencies in the [`go.mod`
file](#go.mod-files) for the [main module](#glos-main-module), then builds and
installs packages listed on the command line.
The first step is to determine which modules to update. `go get` accepts a list
of packages, package patterns, and module paths as arguments. If a package
argument is specified, `go get` updates the module that provides the package.
If a package pattern is specified (for example, `all` or a path with a `...`
wildcard), `go get` expands the pattern to a set of packages, then updates the
modules that provide the packages. If an argument names a module but not a
package (for example, the module `golang.org/x/net` has no package in its root
directory), `go get` will update the module but will not build a package. If no
arguments are specified, `go get` acts as if `.` were specified (the package in
the current directory); this may be used together with the `-u` flag to update
modules that provide imported packages.
Each argument may include a <dfn>version query suffix</dfn> indicating the
desired version, as in `go get golang.org/x/text@v0.3.0`. A version query
suffix consists of an `@` symbol followed by a [version query](#version-queries),
which may indicate a specific version (`v0.3.0`), a version prefix (`v0.3`),
a branch or tag name (`master`), a revision (`1234abcd`), or one of the special
queries `latest`, `upgrade`, `patch`, or `none`. If no version is given,
`go get` uses the `@upgrade` query.
Once `go get` has resolved its arguments to specific modules and versions, `go
get` will add, change, or remove [`require` directives](#go.mod-require) in the
main module's `go.mod` file to ensure the modules remain at the desired
versions in the future. Note that required versions in `go.mod` files are
*minimum versions* and may be increased automatically as new dependencies are
added. See [Minimal version selection (MVS)](#minimal-version-selection) for
details on how versions are selected and conflicts are resolved by module-aware
commands.
<!-- TODO(jayconrod): add diagrams for the examples below.
We need a consistent strategy for visualizing module graphs here, in the MVS
section, and perhaps in other documentation (blog posts, etc.).
-->
Other modules may be upgraded when a module named on the command line is added,
upgraded, or downgraded if the new version of the named module requires other
modules at higher versions. For example, suppose module `example.com/a` is
upgraded to version `v1.5.0`, and that version requires module `example.com/b`
at version `v1.2.0`. If module `example.com/b` is currently required at version
`v1.1.0`, `go get example.com/a@v1.5.0` will also upgrade `example.com/b` to
`v1.2.0`.
Other modules may be downgraded when a module named on the command line is
downgraded or removed. To continue the above example, suppose module
`example.com/b` is downgraded to `v1.1.0`. Module `example.com/a` would also be
downgraded to a version that requires `example.com/b` at version `v1.1.0` or
lower.
A module requirement may be removed using the version suffix `@none`. This is a
special kind of downgrade. Modules that depend on the removed module will be
downgraded or removed as needed. A module requirement may be removed even if one
or more of its packages are imported by packages in the main module. In this
case, the next build command may add a new module requirement.
If a module is needed at two different versions (specified explicitly in command
line arguments or to satisfy upgrades and downgrades), `go get` will report an
error.
After `go get` updates the `go.mod` file, it builds the packages named
on the command line. Executables will be installed in the directory named by
the `GOBIN` environment variable, which defaults to `$GOPATH/bin` or
`$HOME/go/bin` if the `GOPATH` environment variable is not set.
`go get` supports the following flags:
* The `-d` flag tells `go get` not to build or install packages. When `-d` is
used, `go get` will only manage dependencies in `go.mod`.
* The `-u` flag tells `go get` to upgrade modules providing packages
imported directly or indirectly by packages named on the command line.
Each module selected by `-u` will be upgraded to its latest version unless
it is already required at a higher version (a pre-release).
* The `-u=patch` flag (not `-u patch`) also tells `go get` to upgrade
dependencies, but `go get` will upgrade each dependency to the latest patch
version (similar to the `@patch` version query).
* The `-t` flag tells `go get` to consider modules needed to build tests
of packages named on the command line. When `-t` and `-u` are used together,
`go get` will update test dependencies as well.
* The `-insecure` flag should no longer be used. It permits `go get` to resolve
custom import paths and fetch from repositories and module proxies using
insecure schemes such as HTTP. The `GOINSECURE` [environment
variable](#environment-variables) provides more fine-grained control and
should be used instead.
<a id="go-list-m"></a>
### `go list -m`
Usage:
```
go list -m [-u] [-versions] [list flags] [modules]
```
Example:
```
$ go list -m all
$ go list -m -versions example.com/m
$ go list -m -json example.com/m@latest
```
The `-m` flag causes `go list` to list modules instead of packages. In this
mode, the arguments to `go list` may be modules, module patterns (containing the
`...` wildcard), [version queries](#version-queries), or the special pattern
`all`, which matches all modules in the [build list](#glos-build-list). If no
arguments are specified, the [main module](#glos-main-module) is listed.
When listing modules, the `-f` flag still specifies a format template applied
to a Go struct, but now a `Module` struct:
```
type Module struct {
Path string // module path
Version string // module version
Versions []string // available module versions (with -versions)
Replace *Module // replaced by this module
Time *time.Time // time version was created
Update *Module // available update, if any (with -u)
Main bool // is this the main module?
Indirect bool // is this module only an indirect dependency of main module?
Dir string // directory holding files for this module, if any
GoMod string // path to go.mod file for this module, if any
GoVersion string // go version used in module
Error *ModuleError // error loading module
}
type ModuleError struct {
Err string // the error itself
}
```
The default output is to print the module path and then information about the
version and replacement if any. For example, `go list -m all` might print:
```
example.com/main/module
golang.org/x/text v0.3.0 => /tmp/text
rsc.io/pdf v0.1.1
```
The `Module` struct has a `String` method that formats this line of output, so
that the default format is equivalent to `-f '{{.String}}'`.
Note that when a module has been replaced, its `Replace` field describes the
replacement module module, and its `Dir` field is set to the replacement
module's source code, if present. (That is, if `Replace` is non-nil, then `Dir`
is set to `Replace.Dir`, with no access to the replaced source code.)
The `-u` flag adds information about available upgrades. When the latest version
of a given module is newer than the current one, `list -u` sets the module's
`Update` field to information about the newer module. The module's `String`
method indicates an available upgrade by formatting the newer version in
brackets after the current version. For example, `go list -m -u all` might
print:
```
example.com/main/module
golang.org/x/text v0.3.0 [v0.4.0] => /tmp/text
rsc.io/pdf v0.1.1 [v0.1.2]
```
(For tools, `go list -m -u -json all` may be more convenient to parse.)
The `-versions` flag causes `list` to set the module's `Versions` field to a
list of all known versions of that module, ordered according to semantic
versioning, lowest to highest. The flag also changes the default output format
to display the module path followed by the space-separated version list.
The template function `module` takes a single string argument that must be a
module path or query and returns the specified module as a `Module` struct. If
an error occurs, the result will be a `Module` struct with a non-nil `Error`
field.
<a id="go-mod-download"></a>
### `go mod download`
Usage:
```
go mod download [-json] [-x] [modules]
```
Example:
```
$ go mod download
$ go mod download golang.org/x/mod@v0.2.0
```
The `go mod download` command downloads the named modules into the [module
cache](#glos-module-cache). Arguments can be module paths or module
patterns selecting dependencies of the main module or [version
queries](#version-queries) of the form `path@version`. With no arguments,
`download` applies to all dependencies of the [main module](#glos-main-module).
The `go` command will automatically download modules as needed during ordinary
execution. The `go mod download` command is useful mainly for pre-filling the
module cache or for loading data to be served by a [module
proxy](#glos-module-proxy).
By default, `download` writes nothing to standard output. It prints progress
messages and errors to standard error.
The `-json` flag causes `download` to print a sequence of JSON objects to
standard output, describing each downloaded module (or failure), corresponding
to this Go struct:
```
type Module struct {
Path string // module path
Version string // module version
Error string // error loading module
Info string // absolute path to cached .info file
GoMod string // absolute path to cached .mod file
Zip string // absolute path to cached .zip file
Dir string // absolute path to cached source root directory
Sum string // checksum for path, version (as in go.sum)
GoModSum string // checksum for go.mod (as in go.sum)
}
```
The `-x` flag causes `download` to print the commands `download` executes
to standard error.
<a id="go-mod-edit"></a>
### `go mod edit`
<a id="go-mod-init"></a>
### `go mod init`
Usage:
```
go mod init [module-path]
```
Example:
```
go mod init
go mod init example.com/m
```
The `go mod init` command initializes and writes a new `go.mod` file in the
current directory, in effect creating a new module rooted at the current
directory. The `go.mod` file must not already exist.
`init` accepts one optional argument, the [module path](#glos-module-path) for
the new module. See [Module paths](#module-path) for instructions on choosing
a module path. If the module path argument is omitted, `init` will attempt
to infer the module path using import comments in `.go` files, vendoring tool
configuration files, and the current directory (if in `GOPATH`).
If a configuration file for a vendoring tool is present, `init` will attempt to
import module requirements from it. `init` supports the following configuration
files.
* `GLOCKFILE` (Glock)
* `Godeps/Godeps.json` (Godeps)
* `Gopkg.lock` (dep)
* `dependencies.tsv` (godeps)
* `glide.lock` (glide)
* `vendor.conf` (trash)
* `vendor.yml` (govend)
* `vendor/manifest` (gvt)
* `vendor/vendor.json` (govendor)
Vendoring tool configuration files can't always be translated with perfect
fidelity. For example, if multiple packages within the same repository are
imported at different versions, and the repository only contains one module, the
imported `go.mod` can only require the module at one version. You may wish to
run [`go list -m all`](#go-list-m) to check all versions in the [build
list](#glos-build-list), and [`go mod tidy`](#go-mod-tidy) to add missing
requirements and to drop unused requirements.
<a id="go-mod-tidy"></a>
### `go mod tidy`
<a id="go-mod-vendor"></a>
### `go mod vendor`
Usage:
```
go mod vendor [-v]
```
The `go mod vendor` command constructs a directory named `vendor` in the [main
module's](#glos-main-module) root directory that contains copies of all packages
needed to support builds and tests of packages in the main module. Packages
that are only imported by tests of packages outside the main module are not
included. As with [`go mod tidy`](#go-mod-tidy) and other module commands,
[build constraints](#glos-build-constraint) except for `ignore` are not
considered when constructing the `vendor` directory.
When vendoring is enabled, the `go` command will load packages from the `vendor`
directory instead of downloading modules from their sources into the module
cache and using packages those downloaded copies. See [Vendoring](#vendoring)
for more information.
`go mod vendor` also creates the file `vendor/modules.txt` that contains a list
of vendored packages and the module versions they were copied from. When
vendoring is enabled, this manifest is used as a source of module version
information, as reported by [`go list -m`](#go-list-m) and [`go version
-m`](#go-version-m). When the `go` command reads `vendor/modules.txt`, it checks
that the module versions are consistent with `go.mod`. If `go.mod` changed since
`vendor/modules.txt` was generated, `go mod vendor` should be run again.
Note that `go mod vendor` removes the `vendor` directory if it exists before
re-constructing it. Local changes should not be made to vendored packages.
The `go` command does not check that packages in the `vendor` directory have
not been modified, but one can verify the integrity of the `vendor` directory
by running `go mod vendor` and checking that no changes were made.
The `-v` flag causes `go mod vendor` to print the names of vendored modules
and packages to standard error.
<a id="go-mod-verify"></a>
### `go mod verify`
<a id="go-version-m"></a>
### `go version -m`
<a id="go-clean-modcache"></a>
### `go clean -modcache`
<a id="version-queries"></a>
### Version queries
Several commands allow you to specify a version of a module using a *version
query*, which appears after an `@` character following a module or package path
on the command line.
Examples:
```
go get example.com/m@latest
go mod download example.com/m@master
go list -m -json example.com/m@e3702bed2
```
A version query may be one of the following:
* A fully-specified semantic version, such as `v1.2.3`, which selects a
specific version. See [Versions](#versions) for syntax.
* A semantic version prefix, such as `v1` or `v1.2`, which selects the highest
available version with that prefix.
* A semantic version comparison, such as `<v1.2.3` or `>=v1.5.6`, which selects
the nearest available version to the comparison target (the lowest version
for `>` and `>=`, and the highest version for `<` and `<=`).
* A revision identifier for the underlying source repository, such as a commit
hash prefix, revision tag, or branch name. If the revision is tagged with a
semantic version, this query selects that version. Otherwise, this query
selects a [pseudo-version](#glos-pseudo-version) for the underlying
commit. Note that branches and tags with names matched by other version
queries cannot be selected this way. For example, the query `v2` selects the
latest version starting with `v2`, not the branch named `v2`.
* The string `latest`, which selects the highest available release version. If
there are no release versions, `latest` selects the highest pre-release
version. If there no tagged versions, `latest` selects a pseudo-version for
the commit at the tip of the repository's default branch.
* The string `upgrade`, which is like `latest` except that if the module is
currently required at a higher version than the version `latest` would select
(for example, a pre-release), `upgrade` will select the current version.
* The string `patch`, which selects the latest available version with the same
major and minor version numbers as the currently required version. If no
version is currently required, `patch` is equivalent to `latest`.
Except for queries for specific named versions or revisions, all queries
consider available versions reported by `go list -m -versions` (see [`go list
-m`](#go-list-m)). This list contains only tagged versions, not pseudo-versions.
Module versions disallowed by [exclude](#go.mod-exclude) directives in
the main module's [`go.mod` file](#glos-go.mod-file) are not considered.
[Release versions](#glos-release-version) are preferred over pre-release
versions. For example, if versions `v1.2.2` and `v1.2.3-pre` are available, the
`latest` query will select `v1.2.2`, even though `v1.2.3-pre` is higher. The
`<v1.2.4` query would also select `v1.2.2`, even though `v1.2.3-pre` is closer
to `v1.2.4`. If no release or pre-release version is available, the `latest`,
`upgrade`, and `patch` queries will select a pseudo-version for the commit
at the tip of the repository's default branch. Other queries will report
an error.
<a id="commands-outside"></a>
### Module commands outside a module
Module-aware Go commands normally run in the context of a [main
module](#glos-main-module) defined by a `go.mod` file in the working directory
or a parent directory. Some commands may be run in module-aware mode without a
`go.mod` file by setting the `GO111MODULE` environment variable to `on`.
Most commands work differently when no `go.mod` file is present.
See [Module-aware commands](#mod-commands) for information on enabling and
disabling module-aware mode.
<table class="ModTable">
<thead>
<tr>
<th>Command</th>
<th>Behavior</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>go build</code><br>
<code>go doc</code><br>
<code>go fix</code><br>
<code>go fmt</code><br>
<code>go generate</code><br>
<code>go install</code><br>
<code>go list</code><br>
<code>go run</code><br>
<code>go test</code><br>
<code>go vet</code>
</td>
<td>
Only packages in the standard library and packages specified as
<code>.go</code> files on the command line can be loaded, imported, and
built. Packages from other modules cannot be built, since there is no
place to record module requirements and ensure deterministic builds.
</td>
</tr>
<tr>
<td><code>go get</code></td>
<td>
Packages and executables may be built and installed as usual. Note that
there is no main module when <code>go get</code> is run without a
<code>go.mod</code> file, so <code>replace</code> and
<code>exclude</code> directives are not applied.
</td>
</tr>
<tr>
<td><code>go list -m</code></td>
<td>
Explicit <a href="#version-queries">version queries</a> are required
for most arguments, except when the <code>-versions</code> flag is used.
</td>
</tr>
<tr>
<td><code>go mod download</code></td>
<td>
Explicit <a href="#version-queries">version queries</a> are required
for most arguments.
</td>
</tr>
<tr>
<td><code>go mod edit</code></td>
<td>An explicit file argument is required.</td>
</tr>
<tr>
<td>
<code>go mod graph</code><br>
<code>go mod tidy</code><br>
<code>go mod vendor</code><br>
<code>go mod verify</code><br>
<code>go mod why</code>
</td>
<td>
These commands require a <code>go.mod</code> file and will report
an error if one is not present.
</td>
</tr>
</tbody>
</table>
<a id="module-proxy"></a>
## Module proxies
<a id="goproxy-protocol"></a>
### `GOPROXY` protocol
A [*module proxy*](#glos-module-proxy) is an HTTP server that can respond to
`GET` requests for paths specified below. The requests have no query parameters,
and no specific headers are required, so even a site serving from a fixed file
system (including a `file://` URL) can be a module proxy.
Successful HTTP responses must have the status code 200 (OK). Redirects (3xx)
are followed. Responses with status codes 4xx and 5xx are treated as errors.
The error codes 404 (Not Found) and 410 (Gone) indicate that the
requested module or version is not available on the proxy, but it may be found
elsewhere. Error responses should have content type `text/plain` with
`charset` either `utf-8` or `us-ascii`.
The `go` command may be configured to contact proxies or source control servers
using the `GOPROXY` environment variable, which is a comma-separated list of
URLs or the keywords `direct` or `off` (see [Environment
variables](#environment-variables) for details). When the `go` command receives
a 404 or 410 response from a proxy, it falls back to later proxies in the
list. The `go` command does not fall back to later proxies in response to other
4xx and 5xx errors. This allows a proxy to act as a gatekeeper, for example, by
responding with error 403 (Forbidden) for modules not on an approved list.
<!-- TODO(katiehockman): why only fall back for 410/404? Either add the details
here, or write a blog post about how to build multiple types of proxies. e.g.
a "privacy preserving one" and an "authorization one" -->
The table below specifies queries that a module proxy must respond to. For each
path, `$base` is the path portion of a proxy URL,`$module` is a module path, and
`$version` is a version. For example, if the proxy URL is
`https://example.com/mod`, and the client is requesting the `go.mod` file for
the module `golang.org/x/text` at version `v0.3.2`, the client would send a
`GET` request for `https://example.com/mod/golang.org/x/text/@v/v0.3.2.mod`.
To avoid ambiguity when serving from case-insensitive file systems,
the `$module` and `$version` elements are case-encoded by replacing every
uppercase letter with an exclamation mark followed by the corresponding
lower-case letter. This allows modules `example.com/M` and `example.com/m` to
both be stored on disk, since the former is encoded as `example.com/!m`.
<!-- TODO(jayconrod): This table has multi-line cells, and GitHub Flavored
Markdown doesn't have syntax for that, so we use raw HTML. Gitiles doesn't
include this table in the rendered HTML. Once x/website has a Markdown renderer,
ensure this table is readable. If the cells are too large, and it's difficult
to scan, use paragraphs or sections below.
-->
<table class="ModTable">
<thead>
<tr>
<th>Path</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>$base/$module/@v/list</code></td>
<td>
Returns a list of known versions of the given module in plain text, one
per line. This list should not include pseudo-versions.
</td>
</tr>
<tr>
<td><code>$base/$module/@v/$version.info</code></td>
<td>
<p>
Returns JSON-formatted metadata about a specific version of a module.
The response must be a JSON object that corresponds to the Go data
structure below:
</p>
<pre>
type Info struct {
Version string // version string
Time time.Time // commit time
}
</pre>
<p>
The <code>Version</code> field is required and must contain a valid,
<a href="#glos-canonical-version">canonical version</a> (see
<a href="#versions">Versions</a>). The <code>$version</code> in the
request path does not need to be the same version or even a valid
version; this endpoint may be used to find versions for branch names
or revision identifiers. However, if <code>$version</code> is a
canonical version with a major version compatible with
<code>$module</code>, the <code>Version</code> field in a successful
response must be the same.
</p>
<p>
The <code>Time</code> field is optional. If present, it must be a
string in RFC 3339 format. It indicates the time when the version
was created.
</p>
<p>
More fields may be added in the future, so other names are reserved.
</p>
</td>
</tr>
<tr>
<td><code>$base/$module/@v/$version.mod</code></td>
<td>
Returns the <code>go.mod</code> file for a specific version of a
module. If the module does not have a <code>go.mod</code> file at the
requested version, a file containing only a <code>module</code>
statement with the requested module path must be returned. Otherwise,
the original, unmodified <code>go.mod</code> file must be returned.
</td>
</tr>
<tr>
<td><code>$base/$module/@v/$version.zip</code></td>
<td>
Returns a zip file containing the contents of a specific version of
a module. See <a href="#zip-format">Module zip format</a> for details
on how this zip file must be formatted.
</td>
</tr>
<tr>
<td><code>$base/$module/@latest</code></td>
<td>
Returns JSON-formatted metadata about the latest known version of a
module in the same format as
<code>$base/$module/@v/$version.info</code>. The latest version should
be the version of the module that the <code>go</code> command should use
if <code>$base/$module/@v/list</code> is empty or no listed version is
suitable. This endpoint is optional, and module proxies are not required
to implement it.
</td>
</tr>
</tbody>
</table>
When resolving the latest version of a module, the `go` command will request
`$base/$module/@v/list`, then, if no suitable versions are found,
`$base/$module/@latest`. The `go` command prefers, in order: the semantically
highest release version, the semantically highest pre-release version, and the
chronologically most recent pseudo-version. In Go 1.12 and earlier, the `go`
command considered pseudo-versions in `$base/$module/@v/list` to be pre-release
versions, but this is no longer true since Go 1.13.
A module proxy must always serve the same content for successful
responses for `$base/$module/$version.mod` and `$base/$module/$version.zip`
queries. This content is [cryptographically authenticated](#authenticating)
using [`go.sum` files](#go.sum-file-format) and, by default, the
[checksum database](#checksum-database).
The `go` command caches most content it downloads from module proxies in its
module cache in `$GOPATH/pkg/mod/cache/download`. Even when downloading directly
from version control systems, the `go` command synthesizes explicit `info`,
`mod`, and `zip` files and stores them in this directory, the same as if it had
downloaded them directly from a proxy. The cache layout is the same as the proxy
URL space, so serving `$GOPATH/pkg/mod/cache/download` at (or copying it to)
`https://example.com/proxy` would let users access cached module versions by
setting `GOPROXY` to `https://example.com/proxy`.
<a id="communicating-with-proxies"></a>
### Communicating with proxies
The `go` command may download module source code and metadata from a [module
proxy](#glos-module-proxy). The `GOPROXY` [environment
variable](#environment-variables) may be used to configure which proxies the
`go` command may connect to and whether it may communicate directly with
[version control systems](#vcs). Downloaded module data is saved in the [module
cache](#glos-module-cache). The `go` command will only contact a proxy when it
needs information not already in the cache.
The [`GOPROXY` protocol](#goproxy-protocol) section describes requests that
may be sent to a `GOPROXY` server. However, it's also helpful to understand
when the `go` command makes these requests. For example, `go build` follows
the procedure below:
* Compute the [build list](#glos-build-list) by reading [`go.mod`
files](#glos-go.mod-file) and performing [minimal version selection
(MVS)](#glos-minimal-version-selection).
* Read the packages named on the command line and the packages they import.
* If a package is not provided by any module in the build list, find a module
that provides it. Add a module requirement on its latest version to `go.mod`,
and start over.
* Build packages after everything is loaded.
When the `go` command computes the build list, it loads the `go.mod` file for
each module in the [module graph](#glos-module-graph). If a `go.mod` file is not
in the cache, the `go` command will download it from the proxy using a
`$module/@v/$version.mod` request (where `$module` is the module path and
`$version` is the version). These requests can be tested with a tool like
`curl`. For example, the command below downloads the `go.mod` file for
`golang.org/x/mod` at version `v0.2.0`:
```
$ curl https://proxy.golang.org/golang.org/x/mod/@v/v0.2.0.mod
module golang.org/x/mod
go 1.12
require (
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898
)
```
In order to load a package, the `go` command needs the source code for the
module that provides it. Module source code is distributed in `.zip` files which
are extracted into the module cache. If a module `.zip` is not in the cache,
the `go` command will download it using a `$module/@v/$version.zip` request.
```
$ curl -O https://proxy.golang.org/golang.org/x/mod/@v/v0.2.0.zip
$ unzip -l v0.2.0.zip | head
Archive: v0.2.0.zip
Length Date Time Name
--------- ---------- ----- ----
1479 00-00-1980 00:00 golang.org/x/mod@v0.2.0/LICENSE
1303 00-00-1980 00:00 golang.org/x/mod@v0.2.0/PATENTS
559 00-00-1980 00:00 golang.org/x/mod@v0.2.0/README
21 00-00-1980 00:00 golang.org/x/mod@v0.2.0/codereview.cfg
214 00-00-1980 00:00 golang.org/x/mod@v0.2.0/go.mod
1476 00-00-1980 00:00 golang.org/x/mod@v0.2.0/go.sum
5224 00-00-1980 00:00 golang.org/x/mod@v0.2.0/gosumcheck/main.go
```
Note that `.mod` and `.zip` requests are separate, even though `go.mod` files
are usually contained within `.zip` files. The `go` command may need to download
`go.mod` files for many different modules, and `.mod` files are much smaller
than `.zip` files. Additionally, if a Go project does not have a `go.mod` file,
the proxy will serve a synthetic `go.mod` file that only contains a [`module`
directive](#go.mod-module). Synthetic `go.mod` files are generated by the `go`
command when downloading from a [version control
system](#vcs).
If the `go` command needs to load a package not provided by any module in the
build list, it will attempt to find a new module that provides it. The section
[Resolving a package to a module](#resolve-pkg-mod) describes this process. In
summary, the `go` command requests information about the latest version of each
module path that could possibly contain the package. For example, for the
package `golang.org/x/net/html`, the `go` command would try to find the latest
versions of the modules `golang.org/x/net/html`, `golang.org/x/net`,
`golang.org/x/`, and `golang.org`. Only `golang.org/x/net` actually exists and
provides that package, so the `go` command uses the latest version of that
module. If more than one module provides the package, the `go` command will use
the module with the longest path.
When the `go` command requests the latest version of a module, it first sends a
request for `$module/@v/list`. If the list is empty or none of the returned
versions can be used, it sends a request for `$module/@latest`. Once a version
is chosen, the `go` command sends a `$module/@v/$version.info` request for
metadata. It may then send `$module/@v/$version.mod` and
`$module/@v/$version.zip` requests to load the `go.mod` file and source code.
```
$ curl https://proxy.golang.org/golang.org/x/mod/@v/list
v0.1.0
v0.2.0
$ curl https://proxy.golang.org/golang.org/x/mod/@v/v0.2.0.info
{"Version":"v0.2.0","Time":"2020-01-02T17:33:45Z"}
```
After downloading a `.mod` or `.zip` file, the `go` command computes a
cryptographic hash and checks that it matches a hash in the main module's
`go.sum` file. If the hash is not present in `go.sum`, by default, the `go`
command retrieves it from the [checksum database](#checksum-database). If the
computed hash does not match, the `go` command reports a security error and does
not install the file in the module cache. The `GOPRIVATE` and `GONOSUMDB`
[environment variables](#environment-variables) may be used to disable requests
to the checksum database for specific modules. The `GOSUMDB` environment
variable may also be set to `off` to disable requests to the checksum database
entirely. See [Authenticating modules](#authenticating) for more
information. Note that version lists and version metadata returned for `.info`
requests are not authenticated and may change over time.
<a id="vcs"></a>
## Version control systems
The `go` command may download module source code and metadata directly from a
version control repository. Downloading a module from a
[proxy](#communicating-with-proxies) is usually faster, but connecting directly
to a repository is necessary if a proxy is not available or if a module's
repository is not accessible to a proxy (frequently true for private
repositories). Git, Subversion, Mercurial, Bazaar, and Fossil are supported. A
version control tool must be installed in a directory in `PATH` in order for the
`go` command to use it.
To download specific modules from source repositories instead of a proxy, set
the `GOPRIVATE` or `GONOPROXY` environment variables. To configure the `go`
command to download all modules directly from source repositories, set `GOPROXY`
to `direct`. See [Environment variables](#environment-variables) for more
information.
<a id="vcs-find"></a>
### Finding a repository for a module path
When the `go` command downloads a module in `direct` mode, it starts by locating
the repository that contains the module. The `go` command sends an
HTTP `GET` request to a URL derived from the module path with a
`?go-get=1` query string. For example, for the module `golang.org/x/mod`,
the `go` command may send the following requests:
```
https://golang.org/x/mod?go-get=1 (preferred)
http://golang.org/x/mod?go-get=1 (fallback, only with GOINSECURE)
```
The `go` command will follow redirects but otherwise ignores response status
codes, so the server may respond with a 404 or any other error status. The
`GOINSECURE` environment variable may be set to allow fallback and redirects to
unencrypted HTTP for specific modules.
The server must respond with an HTML document containing a `<meta>` tag in the
document's `<head>`. The `<meta>` tag should appear early in the document to
avoid confusing the `go` command's restricted parser. In particular, it should
appear before any raw JavaScript or CSS. The `<meta>` tag must have the form:
```
<meta name="go-import" content="root-path vcs repo-url">
```
`root-path` is the repository root path, the portion of the module path that
corresponds to the repository's root directory. It must be a prefix or an exact
match of the requested module path. If it's not an exact match, another request
is made for the prefix to verify the `<meta>` tags match.
`vcs` is the version control system. It must be one of `bzr`, `fossil`, `git`,
`hg`, `svn`, `mod`. The `mod` scheme instructs the `go` command to download the
module from the given URL using the [`GOPROXY`
protocol](#goproxy-protocol). This allows developers to distribute modules
without exposing source repositories.
`repo-url` is the repository's URL. If the URL does not include a scheme, the
`go` command will try each protocol supported by the version control system.
For example, with Git, the `go` command will try `https://` then `git+ssh://`.
Insecure protocols may only be used if the module path is matched by the
`GOINSECURE` environment variable.
As an example, consider `golang.org/x/mod` again. The `go` command sends
a request to `https://golang.org/x/mod?go-get=1`. The server responds
with an HTML document containing the tag:
```
<meta name="go-import" content="golang.org/x/mod git https://go.googlesource.com/mod">
```
From this response, the `go` command will use the Git repository at
the remote URL `https://go.googlesource.com/mod`.
GitHub and other popular hosting services respond to `?go-get=1` queries for
all repositories, so usually no server configuration is necessary for modules
hosted at those sites.
After the repository URL is found, the `go` command will clone the repository
into the module cache. In general, the `go` command tries to avoid fetching
unneeded data from a repository. However, the actual commands used vary by
version control system and may change over time. For Git, the `go` command can
list most available versions without downloading commits. It will usually fetch
commits without downloading ancestor commits, but doing so is sometimes
necessary.
<a id="vcs-version"></a>
### Mapping versions to commits
The `go` command may check out a module within a repository at a specific
[canonical version](#glos-canonical-version) like `v1.2.3`, `v2.4.0-beta`, or
`v3.0.0+incompatible`. Each module version should have a <dfn>semantic version
tag</dfn> within the repository that indicates which revision should be checked
out for a given version.
If a module is defined in the repository root directory or in a major version
subdirectory of the root directory, then each version tag name is equal to the
corresponding version. For example, the module `golang.org/x/text` is defined in
the root directory of its repository, so the version `v0.3.2` has the tag
`v0.3.2` in that repository. This is true for most modules.
If a module is defined in a subdirectory within the repository, that is, the
[module subdirectory](#glos-module-subdirectory) portion of the module path is
not empty, then each tag name must be prefixed with the module subdirectory,
followed by a slash. For example, the module `golang.org/x/tools/gopls` is
defined in the `gopls` subdirectory of the repository with root path
`golang.org/x/tools`. The version `v0.4.0` of that module must have the tag
named `gopls/v0.4.0` in that repository.
The major version number of a semantic version tag must be consistent with the
module path's major version suffix (if any). For example, the tag `v1.0.0` could
belong to the module `example.com/mod` but not `example.com/mod/v2`, which would
have tags like `v2.0.0`.
A tag with major version `v2` or higher may belong to a module without a major
version suffix if no `go.mod` file is present, and the module is in the
repository root directory. This kind of version is denoted with the suffix
`+incompatible`. The version tag itself must not have the suffix. See
[Compatibility with non-module repositories](#non-module-compat).
Once a tag is created, it should not be deleted or changed to a different
revision. Versions are [authenticated](#authenticating) to ensure safe,
repeatable builds. If a tag is modified, clients may see a security error when
downloading it. Even after a tag is deleted, its content may remain
available on [module proxies](#glos-module-proxy).
<a id="vcs-pseudo"></a>
### Mapping pseudo-versions to commits
The `go` command may check out a module within a repository at a specific
revision, encoded as a [pseudo-version](#glos-pseudo-version) like
`v1.3.2-0.20191109021931-daa7c04131f5`.
The last 12 characters of the pseudo-version (`daa7c04131f5` in the example
above) indicate a revision in the repository to check out. The meaning of this
depends on the version control system. For Git and Mercurial, this is a prefix
of a commit hash. For Subversion, this is a zero-padded revision number.
Before checking out a commit, the `go` command verifies that the timestamp
(`20191109021931` above) matches the commit date. It also verifies that the base
version (`v1.3.1`, the version before `v1.3.2` in the example above) corresponds
to a semantic version tag that is an ancestor of the commit. These checks ensure
that module authors have full control over how pseudo-versions compare with
other released versions.
See [Pseudo-versions](#pseudo-versions) for more information.
<a id="vcs-branch"></a>
### Mapping branches and commits to versions
A module may be checked out at a specific branch, tag, or revision using a
[version query](#version-queries).
```
go get example.com/mod@master
```
The `go` command converts these names into [canonical
versions](#glos-canonical-version) that can be used with [minimal version
selection (MVS)](#minimal-version-selection). MVS depends on the ability to
order versions unambiguously. Branch names and revisions can't be compared
reliably over time, since they depend on repository structure which may change.
If a revision is tagged with one or more semantic version tags like `v1.2.3`,
the tag for the highest valid version will be used. The `go` command only
considers semantic version tags that could belong to the target module; for
example, the tag `v1.5.2` would not be considered for `example.com/mod/v2` since
the major version doesn't match the module path's suffix.
If a revision is not tagged with a valid semantic version tag, the `go` command
will generate a [pseudo-version](#glos-pseudo-version). If the revision has
ancestors with valid semantic version tags, the highest ancestor version will be
used as the pseudo-version base. See [Pseudo-versions](#pseudo-versions).
<a id="vcs-dir"></a>
### Module directories within a repository
Once a module's repository has been checked out at a specific revision, the `go`
command must locate the directory that contains the module's `go.mod` file
(the module's root directory).
Recall that a [module path](#module-path) consists of three parts: a
repository root path (corresponding to the repository root directory),
a module subdirectory, and a major version suffix (only for modules released at
`v2` or higher).
For most modules, the module path is equal to the repository root path, so
the module's root directory is the repository's root directory.
Modules are sometimes defined in repository subdirectories. This is typically
done for large repositories with multiple components that need to be released
and versioned indepently. Such a module is expected to be found in a
subdirectory that matches the part of the module's path after the repository
root path. For example, suppose the module `example.com/monorepo/foo/bar` is in
the repository with root path `example.com/monorepo`. Its `go.mod` file must be
in the `foo/bar` subdirectory.
If a module is released at major version `v2` or higher, its path must have a
[major version suffix](#major-version-suffixes). A module with a major version
suffix may be defined in one of two subdirectories: one with the suffix,
and one without. For example, suppose a new version of the module above is
released with the path `example.com/monorepo/foo/bar/v2`. Its `go.mod` file
may be in either `foo/bar` or `foo/bar/v2`.
Subdirectories with a major version suffix are <dfn>major version
subdirectories</dfn>. They may be used to develop multiple major versions of a
module on a single branch. This may be unnecessary when development of multiple
major versions proceeds on separate branches. However, major version
subdirectories have an important property: in `GOPATH` mode, package import
paths exactly match directories under `GOPATH/src`. The `go` command provides
minimal module compatibility in `GOPATH` mode (see [Compatibility with
non-module repositories](#non-module-compat)), so major version
subdirectories aren't always necessary for compatibility with projects built in
`GOPATH` mode. Older tools that don't support minimal module compatibility
may have problems though.
Once the `go` command has found the module root directory, it creates a `.zip`
file of the contents of the directory, then extracts the `.zip` file into the
module cache. See [File name and path constraints](#path-constraints) for
details on what files may be included in the `.zip` file. See [Module zip
format](#zip-format) for details on the format of the `.zip` file itself. The
contents of the `.zip` file are [authenticated](#authenticating) before
extraction into the module cache the same way they would be if the `.zip` file
were downloaded from a proxy.
<a id="zip-format"></a>
## Module zip format
<a id="path-constraints"></a>
### File name and path constraints
<a id="private-modules"></a>
## Private modules
<a id="module-cache"></a>
## Module cache
<a id="authenticating"></a>
## Authenticating modules
<!-- TODO: continue this section -->
When deciding whether to trust the source code for a module version just
fetched from a proxy or origin server, the `go` command first consults the
`go.sum` lines in the `go.sum` file of the current module. If the `go.sum` file
does not contain an entry for that module version, then it may consult the
checksum database.
<a id="go.sum-file-format"></a>
### go.sum file format
<a id="checksum-database"></a>
### Checksum database
The checksum database is a global source of `go.sum` lines. The `go` command can
use this in many situations to detect misbehavior by proxies or origin servers.
The checksum database allows for global consistency and reliability for all
publicly available module versions. It makes untrusted proxies possible since
they can't serve the wrong code without it going unnoticed. It also ensures
that the bits associated with a specific version do not change from one day to
the next, even if the module's author subsequently alters the tags in their
repository.
The checksum database is served by [sum.golang.org](https://sum.golang.org),
which is run by Google. It is a [Transparent
Log](https://research.swtch.com/tlog) (or “Merkle Tree”) of `go.sum` line
hashes, which is backed by [Trillian](https://github.com/google/trillian). The
main advantage of a Merkle tree is that independent auditors can verify that it
hasn't been tampered with, so it is more trustworthy than a simple database.
The `go` command interacts with the checksum database using the protocol
originally outlined in [Proposal: Secure the Public Go Module
Ecosystem](https://go.googlesource.com/proposal/+/master/design/25530-sumdb.md#checksum-database).
The table below specifies queries that the checksum database must respond to.
For each path, `$base` is the path portion of the checksum database URL,
`$module` is a module path, and `$version` is a version. For example, if the
checksum database URL is `https://sum.golang.org`, and the client is requesting
the record for the module `golang.org/x/text` at version `v0.3.2`, the client
would send a `GET` request for
`https://sum.golang.org/lookup/golang.org/x/text@v0.3.2`.
To avoid ambiguity when serving from case-insensitive file systems,
the `$module` and `$version` elements are
[case-encoded](https://pkg.go.dev/golang.org/x/mod/module#EscapePath)
by replacing every uppercase letter with an exclamation mark followed by the
corresponding lower-case letter. This allows modules `example.com/M` and
`example.com/m` to both be stored on disk, since the former is encoded as
`example.com/!m`.
Parts of the path surrounded by square brakets, like `[.p/$W]` denote optional
values.
<table class="ModTable">
<thead>
<tr>
<th>Path</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>$base/latest</code></td>
<td>
Returns a signed, encoded tree description for the latest log. This
signed description is in the form of a
<a href="https://pkg.go.dev/golang.org/x/mod/sumdb/note">note</a>,
which is text that has been signed by one or more server keys and can
be verified using the server's public key. The tree description
provides the size of the tree and the hash of the tree head at that
size. This encoding is described in
<code><a href="https://pkg.go.dev/golang.org/x/mod/sumdb/tlog#FormatTree">
golang.org/x/mod/sumdb/tlog#FormatTree</a></code>.
</td>
</tr>
<tr>
<tr>
<td><code>$base/lookup/$module@$version</code></td>
<td>
Returns the log record number for the entry about <code>$module</code>
at <code>$version</code>, followed by the data for the record (that is,
the <code>go.sum</code> lines for <code>$module</code> at
<code>$version</code>) and a signed, encoded tree description that
contains the record.
</td>
</tr>
<tr>
<tr>
<td><code>$base/tile/$H/$L/$K[.p/$W]</code></td>
<td>
Returns a [log tile](https://research.swtch.com/tlog#serving_tiles),
which is a set of hashes that make up a section of the log. Each tile
is defined in a two-dimensional coordinate at tile level
<code>$L</code>, <code>$K</code>th from the left, with a tile height of
<code>$H</code>. The optional <code>.p/$W</code> suffix indicates a
partial log tile with only <code>$W</code> hashes. Clients must fall
back to fetching the full tile if a partial tile is not found.
</td>
</tr>
<tr>
<tr>
<td><code>$base/tile/$H/data/$K[.p/$W]</code></td>
<td>
Returns the record data for the leaf hashes in
<code>/tile/$H/0/$K[.p/$W]</code> (with a literal <code>data</code> path
element).
</td>
</tr>
<tr>
</tbody>
</table>
If the `go` command consults the checksum database, then the first
step is to retrieve the record data through the `/lookup` endpoint. If the
module version is not yet recorded in the log, the checksum database will try
to fetch it from the origin server before replying. This `/lookup` data
provides the sum for this module version as well as its position in the log,
which informs the client of which tiles should be fetched to perform proofs.
The `go` command performs “inclusion” proofs (that a specific record exists in
the log) and “consistency” proofs (that the tree hasn’t been tampered with)
before adding new `go.sum` lines to the main module’s `go.sum` file. It's
important that the data from `/lookup` should never be used without first
authenticating it against the signed tree hash and authenticating the signed
tree hash against the client's timeline of signed tree hashes.
Signed tree hashes and new tiles served by the checksum database are stored
in the module cache, so the `go` command only needs to fetch tiles that are
missing.
The `go` command doesn't need to directly connect to the checksum database. It
can request module sums via a module proxy that
[mirrors the checksum database](https://go.googlesource.com/proposal/+/master/design/25530-sumdb.md#proxying-a-checksum-database)
and supports the protocol above. This can be particularly helpful for private,
corporate proxies which block requests outside the organization.
The `GOSUMDB` environment variable identifies the name of checksum database to use
and optionally its public key and URL, as in:
```
GOSUMDB="sum.golang.org"
GOSUMDB="sum.golang.org+<publickey>"
GOSUMDB="sum.golang.org+<publickey> https://sum.golang.org"
```
The `go` command knows the public key of `sum.golang.org`, and also that the
name `sum.golang.google.cn` (available inside mainland China) connects to the
`sum.golang.org` checksum database; use of any other database requires giving
the public key explicitly. The URL defaults to `https://` followed by the
database name.
`GOSUMDB` defaults to `sum.golang.org`, the Go checksum database run by Google.
See https://sum.golang.org/privacy for the service's privacy policy.
If `GOSUMDB` is set to `off`, or if `go get` is invoked with the `-insecure`
flag, the checksum database is not consulted, and all unrecognized modules are
accepted, at the cost of giving up the security guarantee of verified
repeatable downloads for all modules. A better way to bypass the checksum
database for specific modules is to use the `GOPRIVATE` or `GONOSUMDB`
environment variables. See [Private Modules](#private-modules) for details.
The `go env -w` command can be used to
[set these variables](/pkg/cmd/go/#hdr-Print_Go_environment_information)
for future `go` command invocations.
<a id="privacy"></a>
## Privacy
<a id="environment-variables"></a>
## Environment variables
Module behavior in the `go` command may be configured using the environment
variables listed below. This list only includes module-related environment
variables. See [`go help
environment`](https://golang.org/cmd/go/#hdr-Environment_variables) for a list
of all environment variables recognized by the `go` command.
<table class="ModTable">
<thead>
<tr>
<th>Variable</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>GO111MODULE</code></td>
<td>
<p>
Controls whether the <code>go</code> command runs in module-aware mode
or <code>GOPATH</code> mode. Three values are recognized:
</p>
<ul>
<li>
<code>off</code>: the <code>go</code> command ignores
<code>go.mod</code> files and runs in <code>GOPATH</code> mode.
</li>
<li>
<code>on</code>: the <code>go</code> command runs in module-aware
mode, even when no <code>go.mod</code> file is present.
</li>
<li>
<code>auto</code> (or unset): the <code>go</code> command runs in
module-aware mode if a <code>go.mod</code> file is present in the
current directory or any parent directory (the default behavior).
</li>
</ul>
<p>
See <a href="mod-commands">Module-aware commands</a> for more
information.
</p>
</td>
</tr>
<tr>
<td><code>GOINSECURE</code></td>
<td>
<p>
Comma-separated list of glob patterns (in the syntax of Go's
<a href="/pkg/path/#Match"><code>path.Match</code></a>) of module path
prefixes that may always be fetched in an insecure manner. Only
applies to dependencies that are being fetched directly.
</p>
<p>
Unlike the <code>-insecure</code> flag on <code>go get</code>,
<code>GOINSECURE</code> does not disable module checksum database
validation. <code>GOPRIVATE</code> or <code>GONOSUMDB</code> may be
used to achieve that.
</p>
</td>
</tr>
<tr>
<td><code>GONOPROXY</code></td>
<td>
<p>
Comma-separated list of glob patterns (in the syntax of Go's
<a href="/pkg/path/#Match"><code>path.Match</code></a>) of module path
prefixes that should always be fetched directly from version control
repositories, not from module proxies.
</p>
<p>
If <code>GONOPROXY</code> is not set, it defaults to
<code>GOPRIVATE</code>. See <a href="#privacy">Privacy</a>.
</p>
</td>
</tr>
<tr>
<td><code>GONOSUMDB</code></td>
<td>
<p>
Comma-separated list of glob patterns (in the syntax of Go's
<a href="/pkg/path/#Match"><code>path.Match</code></a>) of module path
prefixes for which the <code>go</code> should not verify checksums
using the checksum database.
</p>
<p>
If <code>GONOSUMDB</code> is not set, it defaults to
<code>GOPRIVATE</code>. See <a href="#privacy">Privacy</a>.
</p>
</td>
</tr>
<tr>
<td><code>GOPATH</code></td>
<td>
<p>
In <code>GOPATH</code> mode, the <code>GOPATH</code> variable is a list
of directories that may contain Go code.
</p>
<p>
In module-aware mode, the <a href="#glos-module-cache">module
cache</a> is stored in the <code>pkg/mod</code> subdirectory of the
first <code>GOPATH</code> directory. Module source code outside the
cache may be stored in any directory.
</p>
<p>
If <code>GOPATH</code> is not set, it defaults to the <code>go</code>
subdirectory of the user's home directory.
</p>
</td>
</tr>
<tr>
<td><code>GOPRIVATE</code></td>
<td>
Comma-separated list of glob patterns (in the syntax of Go's
<a href="/pkg/path/#Match"><code>path.Match</code></a>) of module path
prefixes that should be considered private. <code>GOPRIVATE</code>
is a default value for <code>GONOPROXY</code> and
<code>GONOSUMDB</code>. <code>GOPRIVATE</code> itself has no other
meaning. See <a href="#privacy">Privacy</a>.
</td>
</tr>
<tr>
<td><code>GOPROXY</code></td>
<td>
<p>
Comma-separated list of module proxy URLs. When the <code>go</code>
command looks up information about a module, it will contact each
proxy in the list, in sequence. A proxy may respond with a 404 (Not
Found) or 410 (Gone) status to indicate the module is not available
and the <code>go</code> command should contact the next proxy in
the list. Any other error will cause the <code>go</code> command
to stop without contacting other proxies in the list. This allows
a proxy to act as a gatekeeper, for example, by responding with
403 (Forbidden) for modules not on an approved list.
</p>
<p>
<code>GOPROXY</code> URLs may have the schemes <code>https</code>,
<code>http</code>, or <code>file</code>. If no scheme is specified,
<code>https</code> is assumed. A module cache may be used direclty as
a file proxy:
</p>
<pre>GOPROXY=file://$(go env GOPATH)/pkg/mod/cache/download</pre>
<p>Two keywords may be used in place of proxy URLs:</p>
<ul>
<li>
<code>off</code>: disallows downloading modules from any source.
</li>
<li>
<code>direct</code>: download directly from version control
repositories.
</li>
</ul>
<p>
<code>GOPROXY</code> defaults to
<code>https://proxy.golang.org,direct</code>. Under that
configuration, the <code>go</code> command will first contact the Go
module mirror run by Google, then fall back to a direct connection if
the mirror does not have the module. See
<a href="https://proxy.golang.org/privacy">https://proxy.golang.org/privacy</a>
for the mirror's privacy policy. The <code>GOPRIVATE</code> and
<code>GONOPROXY</code> environment variables may be set to prevent
specific modules from being downloaded using proxies.
</p>
<p>
See <a href="#module-proxy">Module proxies</a> and
<a href="#resolve-pkg-mod">Resolving a package to a module</a> for
more information.
</p>
</td>
</tr>
<tr>
<td><code>GOSUMDB</code></td>
<td>
<p>
Identifies the name of the checksum database to use and optionally
its public key and URL. For example:
</p>
<pre>
GOSUMDB="sum.golang.org"
GOSUMDB="sum.golang.org+&lt;publickey&gt;"
GOSUMDB="sum.golang.org+&lt;publickey&gt; https://sum.golang.org
</pre>
<p>
The <code>go</code> command knows the public key of
<code>sum.golang.org</code> and also that the name
<code>sum.golang.google.cn</code> (available inside mainland China)
connects to the <code>sum.golang.org</code> database; use of any other
database requires giving the public key explicitly. The URL defaults
to <code>https://</code> followed by the database name.
</p>
<p>
<code>GOSUMDB</code> defaults to <code>sum.golang.org</code>, the
Go checksum database run by Google. See
<a href="https://sum.golang.org/privacy">https://sum.golang.org/privacy</a>
for the service's privacy policy.
<p>
<p>
If <code>GOSUMDB</code> is set to <code>off</code> or if
<code>go get</code> is invoked with the <code>-insecure</code> flag,
the checksum database is not consulted, and all unrecognized modules
are accepted, at the cost of giving up the security guarantee of
verified repeatable downloads for all modules. A better way to bypass
the checksum database for specific modules is to use the
<code>GOPRIVATE</code> or <code>GONOSUMDB</code> environment
variables.
</p>
<p>
See <a href="#authenticating">Authenticating modules</a> and
<a href="#privacy">Privacy</a> for more information.
</p>
</td>
</tr>
</tbody>
</table>
<a id="glossary"></a>
## Glossary
<a id="glos-build-constraint"></a>
**build constraint:** A condition that determines whether a Go source file is
used when compiling a package. Build constraints may be expressed with file name
suffixes (for example, `foo_linux_amd64.go`) or with build constraint comments
(for example, `// +build linux,amd64`). See [Build
Constraints](https://golang.org/pkg/go/build/#hdr-Build_Constraints).
<a id="glos-build-list"></a>
**build list:** The list of module versions that will be used for a build
command such as `go build`, `go list`, or `go test`. The build list is
determined from the [main module's](#glos-main-module) [`go.mod`
file](#glos-go.mod-file) and `go.mod` files in transitively required modules
using [minimal version selection](#glos-minimal-version-selection). The build
list contains versions for all modules in the [module
graph](#glos-module-graph), not just those relevant to a specific command.
<a id="glos-canonical-version"></a>
**canonical version:** A correctly formatted [version](#glos-version) without
a build metadata suffix other than `+incompatible`. For example, `v1.2.3`
is a canonical version, but `v1.2.3+meta` is not.
<a id="glos-go.mod-file"></a>
**`go.mod` file:** The file that defines a module's path, requirements, and
other metadata. Appears in the [module's root
directory](#glos-module-root-directory). See the section on [`go.mod`
files](#go.mod-files).
<a id="glos-import-path"></a>
**import path:** A string used to import a package in a Go source file.
Synonymous with [package path](#glos-package-path).
<a id="glos-main-module"></a>
**main module:** The module in which the `go` command is invoked.
<a id="glos-major-version"></a>
**major version:** The first number in a semantic version (`1` in `v1.2.3`). In
a release with incompatible changes, the major version must be incremented, and
the minor and patch versions must be set to 0. Semantic versions with major
version 0 are considered unstable.
<a id="glos-major-version-subdirectory"></a>
**major version subdirectory:** A subdirectory within a version control
repository matching a module's [major version
suffix](#glos-major-version-suffix) where a module may be defined. For example,
the module `example.com/mod/v2` in the repository with [root
path](#glos-repository-root-path) `example.com/mod` may be defined in the
repository root directory or the major version subdirectory `v2`. See [Module
directories within a repository](#vcs-dir).
<a id="glos-major-version-suffix"></a>
**major version suffix:** A module path suffix that matches the major version
number. For example, `/v2` in `example.com/mod/v2`. Major version suffixes are
required at `v2.0.0` and later and are not allowed at earlier versions. See
the section on [Major version suffixes](#major-version-suffixes).
<a id="glos-minimal-version-selection"></a>
**minimal version selection (MVS):** The algorithm used to determine the
versions of all modules that will be used in a build. See the section on
[Minimal version selection](#minimal-version-selection) for details.
<a id="glos-minor-version"></a>
**minor version:** The second number in a semantic version (`2` in `v1.2.3`). In
a release with new, backwards compatible functionality, the minor version must
be incremented, and the patch version must be set to 0.
<a id="glos-module"></a>
**module:** A collection of packages that are released, versioned, and
distributed together.
<a id="glos-module-cache"></a>
**module cache:** A local directory storing downloaded modules, located in
`GOPATH/pkg/mod`. See [Module cache](#module-cache).
<a id="glos-module-graph"></a>
**module graph:** The directed graph of module requirements, rooted at the [main
module](#glos-main-module). Each vertex in the graph is a module; each edge is a
version from a `require` statement in a `go.mod` file (subject to `replace` and
`exclude` statements in the main module's `go.mod` file.
<a id="glos-module-path"></a>
**module path:** A path that identifies a module and acts as a prefix for
package import paths within the module. For example, `"golang.org/x/net"`.
<a id="glos-module-proxy"></a>
**module proxy:** A web server that implements the [`GOPROXY`
protocol](#goproxy-protocol). The `go` command downloads version information,
`go.mod` files, and module zip files from module proxies.
<a id="glos-module-root-directory"></a>
**module root directory:** The directory that contains the `go.mod` file that
defines a module.
<a id="glos-module-subdirectory"></a>
**module subdirectory:** The portion of a [module path](#glos-module-path) after
the [repository root path](#glos-repository-root-path) that indicates the
subdirectory where the module is defined. When non-empty, the module
subdirectory is also a prefix for [semantic version
tags](#glos-semantic-version-tag). The module subdirectory does not include the
[major version suffix](#glos-major-version-suffix), if there is one, even if the
module is in a [major version subdirectory](#glos-major-version-subdirectory).
See [Module paths](#module-path).
<a id="glos-package"></a>
**package:** A collection of source files in the same directory that are
compiled together. See the [Packages section](/ref/spec#Packages) in the Go
Language Specification.
<a id="glos-package-path"></a>
**package path:** The path that uniquely identifies a package. A package path is
a [module path](#glos-module-path) joined with a subdirectory within the module.
For example `"golang.org/x/net/html"` is the package path for the package in the
module `"golang.org/x/net"` in the `"html"` subdirectory. Synonym of
[import path](#glos-import-path).
<a id="glos-patch-version"></a>
**patch version:** The third number in a semantic version (`3` in `v1.2.3`). In
a release with no changes to the module's public interface, the patch version
must be incremented.
<a id="glos-pre-release-version"></a>
**pre-release version:** A version with a dash followed by a series of
dot-separated identifiers immediately following the patch version, for example,
`v1.2.3-beta4`. Pre-release versions are considered unstable and are not
assumed to be compatible with other versions. A pre-release version sorts before
the corresponding release version: `v1.2.3-pre` comes before `v1.2.3`. See also
[release version](#glos-release-version).
<a id="glos-pseudo-version"></a>
**pseudo-version:** A version that encodes a revision identifier (such as a Git
commit hash) and a timestamp from a version control system. For example,
`v0.0.0-20191109021931-daa7c04131f5`. Used for [compatibility with non-module
repositories](#non-module-compat) and in other situations when a tagged
version is not available.
<a id="glos-release-version"></a>
**release version:** A version without a pre-release suffix. For example,
`v1.2.3`, not `v1.2.3-pre`. See also [pre-release
version](#glos-pre-release-version).
<a id="glos-repository-root-path"></a>
**repository root path:** The portion of a [module path](#glos-module-path) that
corresponds to a version control repository's root directory. See [Module
paths](#module-path).
<a id="glos-semantic-version-tag"></a>
**semantic version tag:** A tag in a version control repository that maps a
[version](#glos-version) to a specific revision. See [Mapping versions to
commits](#vcs-version).
<a id="glos-version"></a>
**version:** An identifier for an immutable snapshot of a module, written as the
letter `v` followed by a semantic version. See the section on
[Versions](#versions).