go get和go install有什么区别?


81

使用该go工具一段时间后,它看起来像go get

  1. (可选)下载,
  2. 编译,
  3. 并安装

一个软件,而go install仅仅是

  1. 编译
  2. 并安装

它。在这种情况下,为什么该go install命令go get被取代而存在?

Answers:


75

go install是本地工作时工作流程的一部分。假设您要使用库,但是由于某些原因需要进行更改。您可以这样做:

  • go get -d library,仅下载它;
  • 对下载的软件包进行更改;
  • go install library 安装本地版本。

据我知道go get有没有标志,以表明它应该下载,所以它不能代替go install在这里。

从头开始开发新程序包时,将使用相同的工作流程。


1
很好,我想我现在明白了,这要感谢你的第一个例子。但是,在您的第二个(从头开始开发新程序包)中,我也可以使用go get ./path/to/local_package,它的行为与使用过的相同go install ./path/to/local_package,对吗?由于在这种情况下没有下载过程。
thiagowfx

go install使您的目标更加明确,但我想两者都会达成相同的目标。我测试了一些软件包,包括声明为的软件包,main它们看起来是等效的。该命令非常缺少文档。
BoppreH 2014年

在这里,它说,你需要一个GCC的go get,但不适合go install。这与该描述有何关系?
AndreKR '16

3
我不同意这个答案。您也可以在第三个要点中使用,go get而不是使用它go install,因为go get不会重新下载该库(除非您添加-u)。go get从头开始编写库时,也可以使用。go install似乎完全多余。
西蒙(Simon)

34

go get 按此顺序执行两个主要操作:

  • 下载并保存$GOPATH/src/<import-path>导入路径中命名的包(源代码)及其依赖项,然后

  • 执行一个 go install

-d标志(go get -d)指示go get下载包后停止; 也就是说,它指示go get不要做go install


区别:

go get //验证是否需要下载软件包,如果需要,请下载然后编译

go install //跳过下载软件包的部分,只需编译即可(如果缺少任何软件包,则会抛出错误)


关于GOPATH环境变量

GOPATH环境变量由围棋工具使用。它必须以能够被设置getbuild并且install包,并指定你的工作空间的位置。在开发Go代码时,很可能需要设置唯一的环境变量。

同样,GOPATH不应指向Go安装,而应指向您的工作区。

例如,在Windows上,如果您确定工作区位于c:\gowork\,则需要将GOPATHvalue设置为c:\gowork

在此处输入图片说明

您的源代码应该位于,c:\gowork\src\<some project folder>\并且在其中go get从命令提示符处运行之后,c:\gowork\src\<some project folder>\您将看到c:\gowork\bin\c:\gowork\pkg\正在创建。


go install不会以支持模块的设置下载软件包。
Berkant Ipek

0

请注意,1.16版(2021年第一季度)将使这一区别更加清晰,使用CL 266360作为问题40276的一部分实现:

go install现在接受带有版本后缀的参数(例如go install example.com/cmd@v1.0.0)。
这会导致go install建立和模块感知模式安装软件包忽略了go.mod文件在当前目录或父目录,如果有一个。
对于在不影响主模块依赖性的情况下安装可执行文件很有用

go install建议使用带有或不带有版本后缀(如上所述)的方法,以模块模式构建和安装软件包。

go get应该与-d标志一起使用,以在不构建软件包的情况下调整当前模块的依赖关系,并且不建议使用go get来构建和安装软件包
将来的版本中,-d将始终启用该标志

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.