go get和go install有什么区别?

时间:2014-07-22 04:06:42

标签: go

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

  1. (可选)下载,
  2. 编译,
  3. 并安装
  4. 一个软件,而go install只是

    1. 编译
    2. 并安装
    3. 它。在这种情况下,为什么go install命令存在,因为go get取代它?

3 个答案:

答案 0 :(得分:48)

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

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

据我所知go get没有标记表明下载,因此无法在此处替换go install

从头开始开发新软件包时使用相同的工作流程。

答案 1 :(得分:13)

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

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

  • 执行go install

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

差异:

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

go install //跳过包下载的部分,只需编译(如果缺少任何包,这将抛出错误)

关于GOPATH环境变量

必须设置GOPATH环境变量才能生成getbuildinstall个包,并指定工作区的位置。它可能是您在开发Go代码时需要设置的唯一环境变量。

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

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

enter image description here

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

答案 2 :(得分:1)

请注意,go 1.16 (Q1 2021)将使这一区别更加清晰,将CL 266360作为issue 40276的一部分来实现:

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

go install(带有或不带有版本后缀,如上所述)现在是在模块模式下构建和安装软件包的推荐方法。

go get 应该与-d标志一起使用,以在不构建包的情况下调整当前模块的依赖性,并使用go get来构建和不推荐安装软件包
未来版本中,-d标志将始终处于启用状态