废弃用于安装可执行文件的 go get

Deprecation of ‘go get’ for installing executable - 废弃用于安装可执行文件的 “go get”

原文:https://go.dev/doc/go-get-install-deprecation

Overview 概述

​ 从 Go 1.17 开始,不推荐使用 go get 安装可执行文件。可以使用 go install 来代替。

​ 在 Go 1.18 中,go get 将不再构建包;它将只用于添加、更新或删除 go.mod 中的依赖项。具体来说,go get将始终像启用-d标志那样行事。

What to use instead 用什么来代替

​ 要在当前模块的上下文中安装一个可执行文件,请使用go install,不带使用版本后缀,如下所示。这将应用当前目录或父目录中go.mod文件的版本要求和其他指令。

go install example.com/cmd

​ 要在忽略当前模块的情况下安装一个可执行文件,请使用带有版本后缀go install,例如@v1.2.3@latest,如下所示。当使用版本后缀时,go install 不会读取或更新当前目录或父目录下的 go.mod 文件。

# 安装特定版本
go install example.com/cmd@v1.2.3

# 安装可用的最高版本
go install example.com/cmd@latest

​ 为了避免歧义,当使用带有版本后缀的go install时,所有参数必须引用同一模块中同一版本的main包。如果该模块有一个go.mod文件,它不能包含像replaceexclude这样的指令,如果它是主模块,会导致它被不同的解释。该模块的vendor目录不被使用。

​ 有关详细信息,请参阅go install

Why this is happening 为什么会出现这种情况

​ 自从引入模块以来,go get命令既被用来更新go.mod中的依赖项,也被用来安装命令。这种组合经常造成混乱和不便:在大多数情况下,开发人员希望更新依赖项或安装命令,但不能同时更新两者。

​ 从Go 1.16开始,go install可以按照命令行指定的版本安装命令,同时忽略当前目录下的go.mod文件(如果存在的话)。现在大多数情况下都应该使用go install来安装命令。

go get 构建和安装命令的功能现在已被弃用,因为这个功能对于go install来说是多余的。删除这一功能将使 go get 更加快速,因为它默认不会编译或链接包。当更新一个无法为当前平台构建的包时,go get 也不会报告错误。

​ 完整的讨论见提议#40276