zoukankan      html  css  js  c++  java
  • Defining Go Modules

    research!rsc: Go & Versioning https://research.swtch.com/vgo

    shawn@a:~/gokit/tmp$ go get --help
    usage: go get [-d] [-t] [-u] [-v] [-insecure] [build flags] [packages]
    Run 'go help get' for details.
    shawn@a:~/gokit/tmp$ go help get
    usage: go get [-d] [-t] [-u] [-v] [-insecure] [build flags] [packages]

    Get resolves and adds dependencies to the current development module
    and then builds and installs them.

    The first step is to resolve which dependencies to add.

    For each named package or package pattern, get must decide which version of
    the corresponding module to use. By default, get looks up the latest tagged
    release version, such as v0.4.5 or v1.2.3. If there are no tagged release
    versions, get looks up the latest tagged pre-release version, such as
    v0.0.1-pre1. If there are no tagged versions at all, get looks up the latest
    known commit. If the module is not already required at a later version
    (for example, a pre-release newer than the latest release), get will use
    the version it looked up. Otherwise, get will use the currently
    required version.

    This default version selection can be overridden by adding an @version
    suffix to the package argument, as in 'go get golang.org/x/text@v0.3.0'.
    The version may be a prefix: @v1 denotes the latest available version starting
    with v1. See 'go help modules' under the heading 'Module queries' for the
    full query syntax.

    For modules stored in source control repositories, the version suffix can
    also be a commit hash, branch identifier, or other syntax known to the
    source control system, as in 'go get golang.org/x/text@master'. Note that
    branches with names that overlap with other module query syntax cannot be
    selected explicitly. For example, the suffix @v2 means the latest version
    starting with v2, not the branch named v2.

    If a module under consideration is already a dependency of the current
    development module, then get will update the required version.
    Specifying a version earlier than the current required version is valid and
    downgrades the dependency. The version suffix @none indicates that the
    dependency should be removed entirely, downgrading or removing modules
    depending on it as needed.

    The version suffix @latest explicitly requests the latest minor release of the
    module named by the given path. The suffix @upgrade is like @latest but
    will not downgrade a module if it is already required at a revision or
    pre-release version newer than the latest released version. The suffix
    @patch requests the latest patch release: the latest released version
    with the same major and minor version numbers as the currently required
    version. Like @upgrade, @patch will not downgrade a module already required
    at a newer version. If the path is not already required, @upgrade and @patch
    are equivalent to @latest.

    Although get defaults to using the latest version of the module containing
    a named package, it does not use the latest version of that module's
    dependencies. Instead it prefers to use the specific dependency versions
    requested by that module. For example, if the latest A requires module
    B v1.2.3, while B v1.2.4 and v1.3.1 are also available, then 'go get A'
    will use the latest A but then use B v1.2.3, as requested by A. (If there
    are competing requirements for a particular module, then 'go get' resolves
    those requirements by taking the maximum requested version.)

    The -t flag instructs get to consider modules needed to build tests of
    packages specified on the command line.

    The -u flag instructs get to update modules providing dependencies
    of packages named on the command line to use newer minor or patch
    releases when available. Continuing the previous example, 'go get -u A'
    will use the latest A with B v1.3.1 (not B v1.2.3). If B requires module C,
    but C does not provide any packages needed to build packages in A
    (not including tests), then C will not be updated.

    The -u=patch flag (not -u patch) also instructs get to update dependencies,
    but changes the default to select patch releases.
    Continuing the previous example,
    'go get -u=patch A@latest' will use the latest A with B v1.2.4 (not B v1.2.3),
    while 'go get -u=patch A' will use a patch release of A instead.

    When the -t and -u flags are used together, get will update
    test dependencies as well.

    In general, adding a new dependency may require upgrading
    existing dependencies to keep a working build, and 'go get' does
    this automatically. Similarly, downgrading one dependency may
    require downgrading other dependencies, and 'go get' does
    this automatically as well.

    The -insecure flag permits fetching from repositories and resolving
    custom domains using insecure schemes such as HTTP. Use with caution. The
    GOINSECURE environment variable is usually a better alternative, since it
    provides control over which modules may be retrieved using an insecure scheme.
    See 'go help environment' for details.

    The second step is to download (if needed), build, and install
    the named packages.

    If an argument names a module but not a package (because there is no
    Go source code in the module's root directory), then the install step
    is skipped for that argument, instead of causing a build failure.
    For example 'go get golang.org/x/perf' succeeds even though there
    is no code corresponding to that import path.

    Note that package patterns are allowed and are expanded after resolving
    the module versions. For example, 'go get golang.org/x/perf/cmd/...'
    adds the latest golang.org/x/perf and then installs the commands in that
    latest version.

    The -d flag instructs get to download the source code needed to build
    the named packages, including downloading necessary dependencies,
    but not to build and install them.

    With no package arguments, 'go get' applies to Go package in the
    current directory, if any. In particular, 'go get -u' and
    'go get -u=patch' update all the dependencies of that package.
    With no package arguments and also without -u, 'go get' is not much more
    than 'go install', and 'go get -d' not much more than 'go list'.

    For more about modules, see 'go help modules'.

    For more about specifying packages, see 'go help packages'.

    This text describes the behavior of get using modules to manage source
    code and dependencies. If instead the go command is running in GOPATH
    mode, the details of get's flags and effects change, as does 'go help get'.
    See 'go help modules' and 'go help gopath-get'.

    See also: go build, go install, go clean, go mod.
    shawn@a:~/gokit/tmp$ go help modules
    A module is a collection of related Go packages.
    Modules are the unit of source code interchange and versioning.
    The go command has direct support for working with modules,
    including recording and resolving dependencies on other modules.
    Modules replace the old GOPATH-based approach to specifying
    which source files are used in a given build.

    Module support

    The go command includes support for Go modules. Module-aware mode is active
    by default whenever a go.mod file is found in the current directory or in
    any parent directory.

    The quickest way to take advantage of module support is to check out your
    repository, create a go.mod file (described in the next section) there, and run
    go commands from within that file tree.

    For more fine-grained control, the go command continues to respect
    a temporary environment variable, GO111MODULE, which can be set to one
    of three string values: off, on, or auto (the default).
    If GO111MODULE=on, then the go command requires the use of modules,
    never consulting GOPATH. We refer to this as the command
    being module-aware or running in "module-aware mode".
    If GO111MODULE=off, then the go command never uses
    module support. Instead it looks in vendor directories and GOPATH
    to find dependencies; we now refer to this as "GOPATH mode."
    If GO111MODULE=auto or is unset, then the go command enables or disables
    module support based on the current directory.
    Module support is enabled only when the current directory contains a
    go.mod file or is below a directory containing a go.mod file.

    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)
    and installed commands (in GOPATH/bin, unless GOBIN is set).

    Defining a module

    A module is defined by a tree of Go source files with a go.mod file
    in the tree's root directory. The directory containing the go.mod file
    is called the module root. Typically the module root will also correspond
    to a source code repository root (but in general it need not).
    The module is the set of all Go packages in the module root and its
    subdirectories, but excluding subtrees with their own go.mod files.

    The "module path" is the import path prefix corresponding to the module root.
    The go.mod file defines the module path and lists the specific versions
    of other modules that should be used when resolving imports during a build,
    by giving their module paths and versions.

    For example, this go.mod declares that the directory containing it is the root
    of the module with path example.com/m, and it also declares that the module
    depends on specific versions of golang.org/x/text and gopkg.in/yaml.v2:

    module example.com/m

    require (
    golang.org/x/text v0.3.0
    gopkg.in/yaml.v2 v2.1.0
    )

    The go.mod file can also specify replacements and excluded versions
    that only apply when building the module directly; they are ignored
    when the module is incorporated into a larger build.
    For more about the go.mod file, see 'go help go.mod'.

    To start a new module, simply create a go.mod file in the root of the
    module's directory tree, containing only a module statement.
    The 'go mod init' command can be used to do this:

    go mod init example.com/m

    In a project already using an existing dependency management tool like
    godep, glide, or dep, 'go mod init' will also add require statements
    matching the existing configuration.

    Once the go.mod file exists, no additional steps are required:
    go commands like 'go build', 'go test', or even 'go list' will automatically
    add new dependencies as needed to satisfy imports.

    The main module and the build list

    The "main module" is the module containing the directory where the go command
    is run. The go command finds the module root by looking for a go.mod in the
    current directory, or else the current directory's parent directory,
    or else the parent's parent directory, and so on.

    The main module's go.mod file defines the precise set of packages available
    for use by the go command, through require, replace, and exclude statements.
    Dependency modules, found by following require statements, also contribute
    to the definition of that set of packages, but only through their go.mod
    files' require statements: any replace and exclude statements in dependency
    modules are ignored. The replace and exclude statements therefore allow the
    main module complete control over its own build, without also being subject
    to complete control by dependencies.

    The set of modules providing packages to builds is called the "build list".
    The build list initially contains only the main module. Then the go command
    adds to the list the exact module versions required by modules already
    on the list, recursively, until there is nothing left to add to the list.
    If multiple versions of a particular module are added to the list,
    then at the end only the latest version (according to semantic version
    ordering) is kept for use in the build.

    The 'go list' command provides information about the main module
    and the build list. For example:

    go list -m # print path of main module
    go list -m -f={{.Dir}} # print root directory of main module
    go list -m all # print build list

    Maintaining module requirements

    The go.mod file is meant to be readable and editable by both
    programmers and tools. The go command itself automatically updates the go.mod file
    to maintain a standard formatting and the accuracy of require statements.

    Any go command that finds an unfamiliar import will look up the module
    containing that import and add the latest version of that module
    to go.mod automatically. In most cases, therefore, it suffices to
    add an import to source code and run 'go build', 'go test', or even 'go list':
    as part of analyzing the package, the go command will discover
    and resolve the import and update the go.mod file.

    Any go command can determine that a module requirement is
    missing and must be added, even when considering only a single
    package from the module. On the other hand, determining that a module requirement
    is no longer necessary and can be deleted requires a full view of
    all packages in the module, across all possible build configurations
    (architectures, operating systems, build tags, and so on).
    The 'go mod tidy' command builds that view and then
    adds any missing module requirements and removes unnecessary ones.

    As part of maintaining the require statements in go.mod, the go command
    tracks which ones provide packages imported directly by the current module
    and which ones provide packages only used indirectly by other module
    dependencies. Requirements needed only for indirect uses are marked with a
    "// indirect" comment in the go.mod file. Indirect requirements are
    automatically removed from the go.mod file once they are implied by other
    direct requirements. Indirect requirements only arise when using modules
    that fail to state some of their own dependencies or when explicitly
    upgrading a module's dependencies ahead of its own stated requirements.

    Because of this automatic maintenance, the information in go.mod is an
    up-to-date, readable description of the build.

    The 'go get' command updates go.mod to change the module versions used in a
    build. An upgrade of one module may imply upgrading others, and similarly a
    downgrade of one module may imply downgrading others. The 'go get' command
    makes these implied changes as well. If go.mod is edited directly, commands
    like 'go build' or 'go list' will assume that an upgrade is intended and
    automatically make any implied upgrades and update go.mod to reflect them.

    The 'go mod' command provides other functionality for use in maintaining
    and understanding modules and go.mod files. See 'go help mod'.

    The -mod build flag provides additional control over updating and use of go.mod.

    If invoked with -mod=readonly, the go command is disallowed from the implicit
    automatic updating of go.mod described above. Instead, it fails when any changes
    to go.mod are needed. This setting is most useful to check that go.mod does
    not need updates, such as in a continuous integration and testing system.
    The "go get" command remains permitted to update go.mod even with -mod=readonly,
    and the "go mod" commands do not take the -mod flag (or any other build flags).

    If invoked with -mod=vendor, the go command loads packages from the main
    module's vendor directory instead of downloading modules to and loading packages
    from the module cache. The go command assumes the vendor directory holds
    correct copies of dependencies, and it does not compute the set of required
    module versions from go.mod files. However, the go command does check that
    vendor/modules.txt (generated by 'go mod vendor') contains metadata consistent
    with go.mod.

    If invoked with -mod=mod, the go command loads modules from the module cache
    even if there is a vendor directory present.

    If the go command is not invoked with a -mod flag and the vendor directory
    is present and the "go" version in go.mod is 1.14 or higher, the go command
    will act as if it were invoked with -mod=vendor.

    Pseudo-versions

    The go.mod file and the go command more generally use semantic versions as
    the standard form for describing module versions, so that versions can be
    compared to determine which should be considered earlier or later than another.
    A module version like v1.2.3 is introduced by tagging a revision in the
    underlying source repository. Untagged revisions can be referred to
    using a "pseudo-version" like v0.0.0-yyyymmddhhmmss-abcdefabcdef,
    where the time is the commit time in UTC and the final suffix is the prefix
    of the commit hash. The time portion ensures that two pseudo-versions can
    be compared to determine which happened later, the commit hash identifes
    the underlying commit, and the prefix (v0.0.0- in this example) is derived from
    the most recent tagged version in the commit graph before this commit.

    There are three pseudo-version forms:

    vX.0.0-yyyymmddhhmmss-abcdefabcdef is used when there is no earlier
    versioned commit with an appropriate major version before the target commit.
    (This was originally the only form, so some older go.mod files use this form
    even for commits that do follow tags.)

    vX.Y.Z-pre.0.yyyymmddhhmmss-abcdefabcdef is used when the most
    recent versioned commit before the target commit is vX.Y.Z-pre.

    vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdefabcdef is used when the most
    recent versioned commit before the target commit is vX.Y.Z.

    Pseudo-versions never need to be typed by hand: the go command will accept
    the plain commit hash and translate it into a pseudo-version (or a tagged
    version if available) automatically. This conversion is an example of a
    module query.

    Module queries

    The go command accepts a "module query" in place of a module version
    both on the command line and in the main module's go.mod file.
    (After evaluating a query found in the main module's go.mod file,
    the go command updates the file to replace the query with its result.)

    A fully-specified semantic version, such as "v1.2.3",
    evaluates to that specific version.

    A semantic version prefix, such as "v1" or "v1.2",
    evaluates to the latest available tagged version with that prefix.

    A semantic version comparison, such as "<v1.2.3" or ">=v1.5.6",
    evaluates to the available tagged version nearest to the comparison target
    (the latest version for < and <=, the earliest version for > and >=).

    The string "latest" matches the latest available tagged version,
    or else the underlying source repository's latest untagged revision.

    The string "upgrade" is like "latest", but if the module is
    currently required at a later version than the version "latest"
    would select (for example, a newer pre-release version), "upgrade"
    will select the later version instead.

    The string "patch" matches the latest available tagged version
    of a module with the same major and minor version numbers as the
    currently required version. If no version is currently required,
    "patch" is equivalent to "latest".

    A revision identifier for the underlying source repository, such as
    a commit hash prefix, revision tag, or branch name, selects that
    specific code revision. If the revision is also tagged with a
    semantic version, the query evaluates to that semantic version.
    Otherwise the query evaluates to a pseudo-version for the commit.
    Note that branches and tags with names that are matched by other
    query syntax cannot be selected this way. For example, the query
    "v2" means the latest version starting with "v2", not the branch
    named "v2".

    All queries prefer release versions to pre-release versions.
    For example, "<v1.2.3" will prefer to return "v1.2.2"
    instead of "v1.2.3-pre1", even though "v1.2.3-pre1" is nearer
    to the comparison target.

    Module versions disallowed by exclude statements in the
    main module's go.mod are considered unavailable and cannot
    be returned by queries.

    For example, these commands are all valid:

    go get github.com/gorilla/mux@latest # same (@latest is default for 'go get')
    go get github.com/gorilla/mux@v1.6.2 # records v1.6.2
    go get github.com/gorilla/mux@e3702bed2 # records v1.6.2
    go get github.com/gorilla/mux@c856192 # records v0.0.0-20180517173623-c85619274f5d
    go get github.com/gorilla/mux@master # records current meaning of master

    Module compatibility and semantic versioning

    The go command requires that modules use semantic versions and expects that
    the versions accurately describe compatibility: it assumes that v1.5.4 is a
    backwards-compatible replacement for v1.5.3, v1.4.0, and even v1.0.0.
    More generally the go command expects that packages follow the
    "import compatibility rule", which says:

    "If an old package and a new package have the same import path,
    the new package must be backwards compatible with the old package."

    Because the go command assumes the import compatibility rule,
    a module definition can only set the minimum required version of one
    of its dependencies: it cannot set a maximum or exclude selected versions.
    Still, the import compatibility rule is not a guarantee: it may be that
    v1.5.4 is buggy and not a backwards-compatible replacement for v1.5.3.
    Because of this, the go command never updates from an older version
    to a newer version of a module unasked.

    In semantic versioning, changing the major version number indicates a lack
    of backwards compatibility with earlier versions. To preserve import
    compatibility, the go command requires that modules with major version v2
    or later use a module path with that major version as the final element.
    For example, version v2.0.0 of example.com/m must instead use module path
    example.com/m/v2, and packages in that module would use that path as
    their import path prefix, as in example.com/m/v2/sub/pkg. Including the
    major version number in the module path and import paths in this way is
    called "semantic import versioning". Pseudo-versions for modules with major
    version v2 and later begin with that major version instead of v0, as in
    v2.0.0-20180326061214-4fc5987536ef.

    As a special case, module paths beginning with gopkg.in/ continue to use the
    conventions established on that system: the major version is always present,
    and it is preceded by a dot instead of a slash: gopkg.in/yaml.v1
    and gopkg.in/yaml.v2, not gopkg.in/yaml and gopkg.in/yaml/v2.

    The go command treats modules with different module paths as unrelated:
    it makes no connection between example.com/m and example.com/m/v2.
    Modules with different major versions can be used together in a build
    and are kept separate by the fact that their packages use different
    import paths.

    In semantic versioning, major version v0 is for initial development,
    indicating no expectations of stability or backwards compatibility.
    Major version v0 does not appear in the module path, because those
    versions are preparation for v1.0.0, and v1 does not appear in the
    module path either.

    Code written before the semantic import versioning convention
    was introduced may use major versions v2 and later to describe
    the same set of unversioned import paths as used in v0 and v1.
    To accommodate such code, if a source code repository has a
    v2.0.0 or later tag for a file tree with no go.mod, the version is
    considered to be part of the v1 module's available versions
    and is given an +incompatible suffix when converted to a module
    version, as in v2.0.0+incompatible. The +incompatible tag is also
    applied to pseudo-versions derived from such versions, as in
    v2.0.1-0.yyyymmddhhmmss-abcdefabcdef+incompatible.

    In general, having a dependency in the build list (as reported by 'go list -m all')
    on a v0 version, pre-release version, pseudo-version, or +incompatible version
    is an indication that problems are more likely when upgrading that
    dependency, since there is no expectation of compatibility for those.

    See https://research.swtch.com/vgo-import for more information about
    semantic import versioning, and see https://semver.org/ for more about
    semantic versioning.

    Module code layout

    For now, see https://research.swtch.com/vgo-module for information
    about how source code in version control systems is mapped to
    module file trees.

    Module downloading and verification

    The go command can fetch modules from a proxy or connect to source control
    servers directly, according to the setting of the GOPROXY environment
    variable (see 'go help env'). The default setting for GOPROXY is
    "https://proxy.golang.org,direct", which means to try the
    Go module mirror run by Google and fall back to a direct connection
    if the proxy reports that it does not have the module (HTTP error 404 or 410).
    See https://proxy.golang.org/privacy for the service's privacy policy.

    If GOPROXY is set to the string "direct", downloads use a direct connection to
    source control servers. Setting GOPROXY to "off" disallows downloading modules
    from any source. Otherwise, GOPROXY is expected to be list of module proxy URLs
    separated by either comma (,) or pipe (|) characters, which control error
    fallback behavior. For each request, the go command tries each proxy in
    sequence. If there is an error, the go command will try the next proxy in the
    list if the error is a 404 or 410 HTTP response or if the current proxy is
    followed by a pipe character, indicating it is safe to fall back on any error.

    The GOPRIVATE and GONOPROXY environment variables allow bypassing
    the proxy for selected modules. See 'go help module-private' for details.

    No matter the source of the modules, the go command checks downloads against
    known checksums, to detect unexpected changes in the content of any specific
    module version from one day to the next. This check first consults the current
    module's go.sum file but falls back to the Go checksum database, controlled by
    the GOSUMDB and GONOSUMDB environment variables. See 'go help module-auth'
    for details.

    See 'go help goproxy' for details about the proxy protocol and also
    the format of the cached downloaded packages.

    Modules and vendoring

    When using modules, the go command typically satisfies dependencies by
    downloading modules from their sources and using those downloaded copies
    (after verification, as described in the previous section). Vendoring may
    be used to allow interoperation with older versions of Go, or to ensure
    that all files used for a build are stored together in a single file tree.

    The command 'go mod vendor' constructs a directory named vendor in the main
    module's root directory that contains copies of all packages needed to support
    builds and tests of packages in the main module. 'go mod vendor' also
    creates the file vendor/modules.txt that contains metadata about vendored
    packages and module versions. This file should be kept consistent with go.mod:
    when vendoring is used, 'go mod vendor' should be run after go.mod is updated.

    If the vendor directory is present in the main module's root directory, it will
    be used automatically if the "go" version in the main module's go.mod file is
    1.14 or higher. Build commands like 'go build' and 'go test' will load packages
    from the vendor directory instead of accessing the network or the local module
    cache. To explicitly enable vendoring, invoke the go command with the flag
    -mod=vendor. To disable vendoring, use the flag -mod=mod.

    Unlike vendoring in GOPATH, the go command ignores vendor directories in
    locations other than the main module's root directory.
    shawn@a:~/gokit/tmp$ go version
    go version go1.15.1 linux/amd64

    shawn@a:~/gokit/tmp$ go get --help
    usage: go get [-d] [-t] [-u] [-v] [-insecure] [build flags] [packages]
    Run 'go help get' for details.
    shawn@a:~/gokit/tmp$ go help get
    usage: go get [-d] [-t] [-u] [-v] [-insecure] [build flags] [packages]

    Get resolves and adds dependencies to the current development module
    and then builds and installs them.

    The first step is to resolve which dependencies to add.

    For each named package or package pattern, get must decide which version of
    the corresponding module to use. By default, get looks up the latest tagged
    release version, such as v0.4.5 or v1.2.3. If there are no tagged release
    versions, get looks up the latest tagged pre-release version, such as
    v0.0.1-pre1. If there are no tagged versions at all, get looks up the latest
    known commit. If the module is not already required at a later version
    (for example, a pre-release newer than the latest release), get will use
    the version it looked up. Otherwise, get will use the currently
    required version.

    This default version selection can be overridden by adding an @version
    suffix to the package argument, as in 'go get golang.org/x/text@v0.3.0'.
    The version may be a prefix: @v1 denotes the latest available version starting
    with v1. See 'go help modules' under the heading 'Module queries' for the
    full query syntax.

    For modules stored in source control repositories, the version suffix can
    also be a commit hash, branch identifier, or other syntax known to the
    source control system, as in 'go get golang.org/x/text@master'. Note that
    branches with names that overlap with other module query syntax cannot be
    selected explicitly. For example, the suffix @v2 means the latest version
    starting with v2, not the branch named v2.

    If a module under consideration is already a dependency of the current
    development module, then get will update the required version.
    Specifying a version earlier than the current required version is valid and
    downgrades the dependency. The version suffix @none indicates that the
    dependency should be removed entirely, downgrading or removing modules
    depending on it as needed.

    The version suffix @latest explicitly requests the latest minor release of the
    module named by the given path. The suffix @upgrade is like @latest but
    will not downgrade a module if it is already required at a revision or
    pre-release version newer than the latest released version. The suffix
    @patch requests the latest patch release: the latest released version
    with the same major and minor version numbers as the currently required
    version. Like @upgrade, @patch will not downgrade a module already required
    at a newer version. If the path is not already required, @upgrade and @patch
    are equivalent to @latest.

    Although get defaults to using the latest version of the module containing
    a named package, it does not use the latest version of that module's
    dependencies. Instead it prefers to use the specific dependency versions
    requested by that module. For example, if the latest A requires module
    B v1.2.3, while B v1.2.4 and v1.3.1 are also available, then 'go get A'
    will use the latest A but then use B v1.2.3, as requested by A. (If there
    are competing requirements for a particular module, then 'go get' resolves
    those requirements by taking the maximum requested version.)

    The -t flag instructs get to consider modules needed to build tests of
    packages specified on the command line.

    The -u flag instructs get to update modules providing dependencies
    of packages named on the command line to use newer minor or patch
    releases when available. Continuing the previous example, 'go get -u A'
    will use the latest A with B v1.3.1 (not B v1.2.3). If B requires module C,
    but C does not provide any packages needed to build packages in A
    (not including tests), then C will not be updated.

    The -u=patch flag (not -u patch) also instructs get to update dependencies,
    but changes the default to select patch releases.
    Continuing the previous example,
    'go get -u=patch A@latest' will use the latest A with B v1.2.4 (not B v1.2.3),
    while 'go get -u=patch A' will use a patch release of A instead.

    When the -t and -u flags are used together, get will update
    test dependencies as well.

    In general, adding a new dependency may require upgrading
    existing dependencies to keep a working build, and 'go get' does
    this automatically. Similarly, downgrading one dependency may
    require downgrading other dependencies, and 'go get' does
    this automatically as well.

    The -insecure flag permits fetching from repositories and resolving
    custom domains using insecure schemes such as HTTP. Use with caution. The
    GOINSECURE environment variable is usually a better alternative, since it
    provides control over which modules may be retrieved using an insecure scheme.
    See 'go help environment' for details.

    The second step is to download (if needed), build, and install
    the named packages.

    If an argument names a module but not a package (because there is no
    Go source code in the module's root directory), then the install step
    is skipped for that argument, instead of causing a build failure.
    For example 'go get golang.org/x/perf' succeeds even though there
    is no code corresponding to that import path.

    Note that package patterns are allowed and are expanded after resolving
    the module versions. For example, 'go get golang.org/x/perf/cmd/...'
    adds the latest golang.org/x/perf and then installs the commands in that
    latest version.

    The -d flag instructs get to download the source code needed to build
    the named packages, including downloading necessary dependencies,
    but not to build and install them.

    With no package arguments, 'go get' applies to Go package in the
    current directory, if any. In particular, 'go get -u' and
    'go get -u=patch' update all the dependencies of that package.
    With no package arguments and also without -u, 'go get' is not much more
    than 'go install', and 'go get -d' not much more than 'go list'.

    For more about modules, see 'go help modules'.

    For more about specifying packages, see 'go help packages'.

    This text describes the behavior of get using modules to manage source
    code and dependencies. If instead the go command is running in GOPATH
    mode, the details of get's flags and effects change, as does 'go help get'.
    See 'go help modules' and 'go help gopath-get'.

    See also: go build, go install, go clean, go mod.
    shawn@a:~/gokit/tmp$ go help modules
    A module is a collection of related Go packages.
    Modules are the unit of source code interchange and versioning.
    The go command has direct support for working with modules,
    including recording and resolving dependencies on other modules.
    Modules replace the old GOPATH-based approach to specifying
    which source files are used in a given build.

    Module support

    The go command includes support for Go modules. Module-aware mode is active
    by default whenever a go.mod file is found in the current directory or in
    any parent directory.

    The quickest way to take advantage of module support is to check out your
    repository, create a go.mod file (described in the next section) there, and run
    go commands from within that file tree.

    For more fine-grained control, the go command continues to respect
    a temporary environment variable, GO111MODULE, which can be set to one
    of three string values: off, on, or auto (the default).
    If GO111MODULE=on, then the go command requires the use of modules,
    never consulting GOPATH. We refer to this as the command
    being module-aware or running in "module-aware mode".
    If GO111MODULE=off, then the go command never uses
    module support. Instead it looks in vendor directories and GOPATH
    to find dependencies; we now refer to this as "GOPATH mode."
    If GO111MODULE=auto or is unset, then the go command enables or disables
    module support based on the current directory.
    Module support is enabled only when the current directory contains a
    go.mod file or is below a directory containing a go.mod file.

    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)
    and installed commands (in GOPATH/bin, unless GOBIN is set).

    Defining a module

    A module is defined by a tree of Go source files with a go.mod file
    in the tree's root directory. The directory containing the go.mod file
    is called the module root. Typically the module root will also correspond
    to a source code repository root (but in general it need not).
    The module is the set of all Go packages in the module root and its
    subdirectories, but excluding subtrees with their own go.mod files.

    The "module path" is the import path prefix corresponding to the module root.
    The go.mod file defines the module path and lists the specific versions
    of other modules that should be used when resolving imports during a build,
    by giving their module paths and versions.

    For example, this go.mod declares that the directory containing it is the root
    of the module with path example.com/m, and it also declares that the module
    depends on specific versions of golang.org/x/text and gopkg.in/yaml.v2:

    module example.com/m

    require (
    golang.org/x/text v0.3.0
    gopkg.in/yaml.v2 v2.1.0
    )

    The go.mod file can also specify replacements and excluded versions
    that only apply when building the module directly; they are ignored
    when the module is incorporated into a larger build.
    For more about the go.mod file, see 'go help go.mod'.

    To start a new module, simply create a go.mod file in the root of the
    module's directory tree, containing only a module statement.
    The 'go mod init' command can be used to do this:

    go mod init example.com/m

    In a project already using an existing dependency management tool like
    godep, glide, or dep, 'go mod init' will also add require statements
    matching the existing configuration.

    Once the go.mod file exists, no additional steps are required:
    go commands like 'go build', 'go test', or even 'go list' will automatically
    add new dependencies as needed to satisfy imports.

    The main module and the build list

    The "main module" is the module containing the directory where the go command
    is run. The go command finds the module root by looking for a go.mod in the
    current directory, or else the current directory's parent directory,
    or else the parent's parent directory, and so on.

    The main module's go.mod file defines the precise set of packages available
    for use by the go command, through require, replace, and exclude statements.
    Dependency modules, found by following require statements, also contribute
    to the definition of that set of packages, but only through their go.mod
    files' require statements: any replace and exclude statements in dependency
    modules are ignored. The replace and exclude statements therefore allow the
    main module complete control over its own build, without also being subject
    to complete control by dependencies.

    The set of modules providing packages to builds is called the "build list".
    The build list initially contains only the main module. Then the go command
    adds to the list the exact module versions required by modules already
    on the list, recursively, until there is nothing left to add to the list.
    If multiple versions of a particular module are added to the list,
    then at the end only the latest version (according to semantic version
    ordering) is kept for use in the build.

    The 'go list' command provides information about the main module
    and the build list. For example:

    go list -m # print path of main module
    go list -m -f={{.Dir}} # print root directory of main module
    go list -m all # print build list

    Maintaining module requirements

    The go.mod file is meant to be readable and editable by both
    programmers and tools. The go command itself automatically updates the go.mod file
    to maintain a standard formatting and the accuracy of require statements.

    Any go command that finds an unfamiliar import will look up the module
    containing that import and add the latest version of that module
    to go.mod automatically. In most cases, therefore, it suffices to
    add an import to source code and run 'go build', 'go test', or even 'go list':
    as part of analyzing the package, the go command will discover
    and resolve the import and update the go.mod file.

    Any go command can determine that a module requirement is
    missing and must be added, even when considering only a single
    package from the module. On the other hand, determining that a module requirement
    is no longer necessary and can be deleted requires a full view of
    all packages in the module, across all possible build configurations
    (architectures, operating systems, build tags, and so on).
    The 'go mod tidy' command builds that view and then
    adds any missing module requirements and removes unnecessary ones.

    As part of maintaining the require statements in go.mod, the go command
    tracks which ones provide packages imported directly by the current module
    and which ones provide packages only used indirectly by other module
    dependencies. Requirements needed only for indirect uses are marked with a
    "// indirect" comment in the go.mod file. Indirect requirements are
    automatically removed from the go.mod file once they are implied by other
    direct requirements. Indirect requirements only arise when using modules
    that fail to state some of their own dependencies or when explicitly
    upgrading a module's dependencies ahead of its own stated requirements.

    Because of this automatic maintenance, the information in go.mod is an
    up-to-date, readable description of the build.

    The 'go get' command updates go.mod to change the module versions used in a
    build. An upgrade of one module may imply upgrading others, and similarly a
    downgrade of one module may imply downgrading others. The 'go get' command
    makes these implied changes as well. If go.mod is edited directly, commands
    like 'go build' or 'go list' will assume that an upgrade is intended and
    automatically make any implied upgrades and update go.mod to reflect them.

    The 'go mod' command provides other functionality for use in maintaining
    and understanding modules and go.mod files. See 'go help mod'.

    The -mod build flag provides additional control over updating and use of go.mod.

    If invoked with -mod=readonly, the go command is disallowed from the implicit
    automatic updating of go.mod described above. Instead, it fails when any changes
    to go.mod are needed. This setting is most useful to check that go.mod does
    not need updates, such as in a continuous integration and testing system.
    The "go get" command remains permitted to update go.mod even with -mod=readonly,
    and the "go mod" commands do not take the -mod flag (or any other build flags).

    If invoked with -mod=vendor, the go command loads packages from the main
    module's vendor directory instead of downloading modules to and loading packages
    from the module cache. The go command assumes the vendor directory holds
    correct copies of dependencies, and it does not compute the set of required
    module versions from go.mod files. However, the go command does check that
    vendor/modules.txt (generated by 'go mod vendor') contains metadata consistent
    with go.mod.

    If invoked with -mod=mod, the go command loads modules from the module cache
    even if there is a vendor directory present.

    If the go command is not invoked with a -mod flag and the vendor directory
    is present and the "go" version in go.mod is 1.14 or higher, the go command
    will act as if it were invoked with -mod=vendor.

    Pseudo-versions

    The go.mod file and the go command more generally use semantic versions as
    the standard form for describing module versions, so that versions can be
    compared to determine which should be considered earlier or later than another.
    A module version like v1.2.3 is introduced by tagging a revision in the
    underlying source repository. Untagged revisions can be referred to
    using a "pseudo-version" like v0.0.0-yyyymmddhhmmss-abcdefabcdef,
    where the time is the commit time in UTC and the final suffix is the prefix
    of the commit hash. The time portion ensures that two pseudo-versions can
    be compared to determine which happened later, the commit hash identifes
    the underlying commit, and the prefix (v0.0.0- in this example) is derived from
    the most recent tagged version in the commit graph before this commit.

    There are three pseudo-version forms:

    vX.0.0-yyyymmddhhmmss-abcdefabcdef is used when there is no earlier
    versioned commit with an appropriate major version before the target commit.
    (This was originally the only form, so some older go.mod files use this form
    even for commits that do follow tags.)

    vX.Y.Z-pre.0.yyyymmddhhmmss-abcdefabcdef is used when the most
    recent versioned commit before the target commit is vX.Y.Z-pre.

    vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdefabcdef is used when the most
    recent versioned commit before the target commit is vX.Y.Z.

    Pseudo-versions never need to be typed by hand: the go command will accept
    the plain commit hash and translate it into a pseudo-version (or a tagged
    version if available) automatically. This conversion is an example of a
    module query.

    Module queries

    The go command accepts a "module query" in place of a module version
    both on the command line and in the main module's go.mod file.
    (After evaluating a query found in the main module's go.mod file,
    the go command updates the file to replace the query with its result.)

    A fully-specified semantic version, such as "v1.2.3",
    evaluates to that specific version.

    A semantic version prefix, such as "v1" or "v1.2",
    evaluates to the latest available tagged version with that prefix.

    A semantic version comparison, such as "<v1.2.3" or ">=v1.5.6",
    evaluates to the available tagged version nearest to the comparison target
    (the latest version for < and <=, the earliest version for > and >=).

    The string "latest" matches the latest available tagged version,
    or else the underlying source repository's latest untagged revision.

    The string "upgrade" is like "latest", but if the module is
    currently required at a later version than the version "latest"
    would select (for example, a newer pre-release version), "upgrade"
    will select the later version instead.

    The string "patch" matches the latest available tagged version
    of a module with the same major and minor version numbers as the
    currently required version. If no version is currently required,
    "patch" is equivalent to "latest".

    A revision identifier for the underlying source repository, such as
    a commit hash prefix, revision tag, or branch name, selects that
    specific code revision. If the revision is also tagged with a
    semantic version, the query evaluates to that semantic version.
    Otherwise the query evaluates to a pseudo-version for the commit.
    Note that branches and tags with names that are matched by other
    query syntax cannot be selected this way. For example, the query
    "v2" means the latest version starting with "v2", not the branch
    named "v2".

    All queries prefer release versions to pre-release versions.
    For example, "<v1.2.3" will prefer to return "v1.2.2"
    instead of "v1.2.3-pre1", even though "v1.2.3-pre1" is nearer
    to the comparison target.

    Module versions disallowed by exclude statements in the
    main module's go.mod are considered unavailable and cannot
    be returned by queries.

    For example, these commands are all valid:

    go get github.com/gorilla/mux@latest # same (@latest is default for 'go get')
    go get github.com/gorilla/mux@v1.6.2 # records v1.6.2
    go get github.com/gorilla/mux@e3702bed2 # records v1.6.2
    go get github.com/gorilla/mux@c856192 # records v0.0.0-20180517173623-c85619274f5d
    go get github.com/gorilla/mux@master # records current meaning of master

    Module compatibility and semantic versioning

    The go command requires that modules use semantic versions and expects that
    the versions accurately describe compatibility: it assumes that v1.5.4 is a
    backwards-compatible replacement for v1.5.3, v1.4.0, and even v1.0.0.
    More generally the go command expects that packages follow the
    "import compatibility rule", which says:

    "If an old package and a new package have the same import path,
    the new package must be backwards compatible with the old package."

    Because the go command assumes the import compatibility rule,
    a module definition can only set the minimum required version of one
    of its dependencies: it cannot set a maximum or exclude selected versions.
    Still, the import compatibility rule is not a guarantee: it may be that
    v1.5.4 is buggy and not a backwards-compatible replacement for v1.5.3.
    Because of this, the go command never updates from an older version
    to a newer version of a module unasked.

    In semantic versioning, changing the major version number indicates a lack
    of backwards compatibility with earlier versions. To preserve import
    compatibility, the go command requires that modules with major version v2
    or later use a module path with that major version as the final element.
    For example, version v2.0.0 of example.com/m must instead use module path
    example.com/m/v2, and packages in that module would use that path as
    their import path prefix, as in example.com/m/v2/sub/pkg. Including the
    major version number in the module path and import paths in this way is
    called "semantic import versioning". Pseudo-versions for modules with major
    version v2 and later begin with that major version instead of v0, as in
    v2.0.0-20180326061214-4fc5987536ef.

    As a special case, module paths beginning with gopkg.in/ continue to use the
    conventions established on that system: the major version is always present,
    and it is preceded by a dot instead of a slash: gopkg.in/yaml.v1
    and gopkg.in/yaml.v2, not gopkg.in/yaml and gopkg.in/yaml/v2.

    The go command treats modules with different module paths as unrelated:
    it makes no connection between example.com/m and example.com/m/v2.
    Modules with different major versions can be used together in a build
    and are kept separate by the fact that their packages use different
    import paths.

    In semantic versioning, major version v0 is for initial development,
    indicating no expectations of stability or backwards compatibility.
    Major version v0 does not appear in the module path, because those
    versions are preparation for v1.0.0, and v1 does not appear in the
    module path either.

    Code written before the semantic import versioning convention
    was introduced may use major versions v2 and later to describe
    the same set of unversioned import paths as used in v0 and v1.
    To accommodate such code, if a source code repository has a
    v2.0.0 or later tag for a file tree with no go.mod, the version is
    considered to be part of the v1 module's available versions
    and is given an +incompatible suffix when converted to a module
    version, as in v2.0.0+incompatible. The +incompatible tag is also
    applied to pseudo-versions derived from such versions, as in
    v2.0.1-0.yyyymmddhhmmss-abcdefabcdef+incompatible.

    In general, having a dependency in the build list (as reported by 'go list -m all')
    on a v0 version, pre-release version, pseudo-version, or +incompatible version
    is an indication that problems are more likely when upgrading that
    dependency, since there is no expectation of compatibility for those.

    See https://research.swtch.com/vgo-import for more information about
    semantic import versioning, and see https://semver.org/ for more about
    semantic versioning.

    Module code layout

    For now, see https://research.swtch.com/vgo-module for information
    about how source code in version control systems is mapped to
    module file trees.

    Module downloading and verification

    The go command can fetch modules from a proxy or connect to source control
    servers directly, according to the setting of the GOPROXY environment
    variable (see 'go help env'). The default setting for GOPROXY is
    "https://proxy.golang.org,direct", which means to try the
    Go module mirror run by Google and fall back to a direct connection
    if the proxy reports that it does not have the module (HTTP error 404 or 410).
    See https://proxy.golang.org/privacy for the service's privacy policy.

    If GOPROXY is set to the string "direct", downloads use a direct connection to
    source control servers. Setting GOPROXY to "off" disallows downloading modules
    from any source. Otherwise, GOPROXY is expected to be list of module proxy URLs
    separated by either comma (,) or pipe (|) characters, which control error
    fallback behavior. For each request, the go command tries each proxy in
    sequence. If there is an error, the go command will try the next proxy in the
    list if the error is a 404 or 410 HTTP response or if the current proxy is
    followed by a pipe character, indicating it is safe to fall back on any error.

    The GOPRIVATE and GONOPROXY environment variables allow bypassing
    the proxy for selected modules. See 'go help module-private' for details.

    No matter the source of the modules, the go command checks downloads against
    known checksums, to detect unexpected changes in the content of any specific
    module version from one day to the next. This check first consults the current
    module's go.sum file but falls back to the Go checksum database, controlled by
    the GOSUMDB and GONOSUMDB environment variables. See 'go help module-auth'
    for details.

    See 'go help goproxy' for details about the proxy protocol and also
    the format of the cached downloaded packages.

    Modules and vendoring

    When using modules, the go command typically satisfies dependencies by
    downloading modules from their sources and using those downloaded copies
    (after verification, as described in the previous section). Vendoring may
    be used to allow interoperation with older versions of Go, or to ensure
    that all files used for a build are stored together in a single file tree.

    The command 'go mod vendor' constructs a directory named vendor in the main
    module's root directory that contains copies of all packages needed to support
    builds and tests of packages in the main module. 'go mod vendor' also
    creates the file vendor/modules.txt that contains metadata about vendored
    packages and module versions. This file should be kept consistent with go.mod:
    when vendoring is used, 'go mod vendor' should be run after go.mod is updated.

    If the vendor directory is present in the main module's root directory, it will
    be used automatically if the "go" version in the main module's go.mod file is
    1.14 or higher. Build commands like 'go build' and 'go test' will load packages
    from the vendor directory instead of accessing the network or the local module
    cache. To explicitly enable vendoring, invoke the go command with the flag
    -mod=vendor. To disable vendoring, use the flag -mod=mod.

    Unlike vendoring in GOPATH, the go command ignores vendor directories in
    locations other than the main module's root directory.
    shawn@a:~/gokit/tmp$ go version
    go version go1.15.1 linux/amd64

    Understanding go.sum and go.mod file in Go (Golang) – Welcome To Golang By Example https://golangbyexample.com/go-mod-sum-module/

    Overview

    Module is go support for dependency management. A module by definition is a collection of related packages with go.mod at its root.  The go.mod file defines the

    • Module import path.
    • The version of go with which the module is created
    • Dependency requirements of the module for a successful build. It defines both project’s dependencies requirement and also locks them to their correct version.

    go.sum

    This file lists down the checksum of direct and indirect dependency required along with the version. It is to be mentioned that the go.mod file is enough for a successful build. They why go.sum file is needed?. The checksum present in go.sum file is used to validate the checksum of each of direct and indirect dependency to confirm that none of them has been modified.

    We mentioned above that go.mod file lists down the dependency requirement of the module. Now a dependency of a module can be of two kind

    • Direct -A direct dependency is a dependency which the module directly imports.
    • Indirect – It is the dependency that is imported by the module’s direct dependencies. Also, any dependency that is mentioned in the go.mod file but not imported in any of the source files of the module is also treated as an indirect dependency.

    go.mod file only records the direct dependency. However, it may record an indirect dependency in the below case

    • Any indirect dependency which is not listed in the go.mod file of your direct dependency or if direct dependency doesn’t have a go.mod file, then that dependency will be added to the go.mod file with //indirect as the suffix. We will see an example of this later in the article to know this better.

    Also please note that both go.mod as well as go.sum file should be checked into the Version Control System (VCS) such as git

     

     

     

  • 相关阅读:
    Java:求字符串中邻接的数字为一个整体
    在jsp提交表单的参数封装到一个方法里
    synchronized
    java内存模型JMM
    多线程学习:线程基础
    集合框架总结与开发遇到的问题
    HashSet、LinkedHashSet学习笔记
    Iterable、Collection、AbstractConlltion、List学习笔记
    LinkedList学习笔记
    LinkedHashMap
  • 原文地址:https://www.cnblogs.com/rsapaper/p/9340118.html
Copyright © 2011-2022 走看看