blob: 070ab5d1de1595e797e0efb359c6ae03b5e35e0b [file] [log] [blame] [view]
<!--{
"Title": "Deprecation of 'go get' for installing executables",
"Path": "/doc/go-get-install-deprecation",
"Breadcrumb": true
}-->
## Overview
Starting in Go 1.17, installing executables with `go get` is deprecated.
`go install` may be used instead.
In Go 1.18, `go get` will no longer build packages; it will only
be used to add, update, or remove dependencies in `go.mod`. Specifically,
`go get` will always act as if the `-d` flag were enabled.
## What to use instead
To install an executable in the context of the current module, use `go install`,
without a version suffix, as below. This applies version requirements and
other directives from the `go.mod` file in the current directory or a parent
directory.
```
go install example.com/cmd
```
To install an executable while ignoring the current module, use `go install`
*with* a [version suffix](/ref/mod#version-queries) like `@v1.2.3` or `@latest`,
as below. When used with a version suffix, `go install` does not read or update
the `go.mod` file in the current directory or a parent directory.
```
# Install a specific version.
go install example.com/cmd@v1.2.3
# Install the highest available version.
go install example.com/cmd@latest
```
In order to avoid ambiguity, when `go install` is used with a version suffix,
all arguments must refer to `main` packages in the same module at the same
version. If that module has a `go.mod` file, it must not contain directives like
`replace` or `exclude` that would cause it to be interpreted differently if it
were the main module. The module's `vendor` directory is not used.
See [`go install`](/ref/mod#go-install) for details.
## Why this is happening
Since modules were introduced, the `go get` command has been used both to update
dependencies in `go.mod` and to install commands. This combination is frequently
confusing and inconvenient: in most cases, developers want to update a
dependency or install a command but not both at the same time.
Since Go 1.16, `go install` can install a command at a version specified on the
command line while ignoring the `go.mod` file in the current directory (if one
exists). `go install` should now be used to install commands in most cases.
`go get`'s ability to build and install commands is now deprecated, since that
functionality is redundant with `go install`. Removing this functionality
will make `go get` faster, since it won't compile or link packages by default.
`go get` also won't report an error when updating a package that can't be built
for the current platform.
See proposal [#40276](/issue/40276) for the full discussion.