Deprecation of 'go get' for installing executables
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 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
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 for the full discussion.