【问题标题】:What is the difference between go get and go install?go get 和 go install 有什么区别?
【发布时间】:2014-07-22 04:06:42
【问题描述】:

go这个工具玩了一会,看起来像go get

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

一个软件,而go install简单

  1. 编译
  2. 并安装

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

【问题讨论】:

  • 对于未来的人:“使用go get 来构建和安装软件包已被弃用。在未来的版本中,-d 标志将始终启用。” 所以, go get 仅供下载。

标签: go


【解决方案1】:

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

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

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

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

编辑:6 年后,Go 1.16 更新并澄清了 go installgo get 的用法:https://tip.golang.org/doc/go1.16#modules

【讨论】:

  • 很好,感谢您的第一个示例,我想我现在明白了。然而,在你的第二个(从头开始开发一个新包)中,我也可以使用go get ./path/to/local_package,它的行为就像我使用go install ./path/to/local_package一样,对吧?由于在这种情况下没有下载过程。
  • go install 使您的目标更加明确,但我想两者都会实现相同的目标。我测试了几个包,包括声明为main 的包,它们看起来是等价的。该命令的文档非常缺乏。
  • Here 它说,go get 需要 gcc,但 go install 不需要。这与此描述有何关系?
  • 我不同意这个答案。您也可以在第三个要点中使用go get 而不是go install,因为go get 不会重新下载库(除非您添加-u)。从头开始编写库时,您也可以使用go getgo install 似乎完全多余。
【解决方案2】:

go get 按此顺序主要做两件事:

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

  • 执行go install

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


区别:

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

go install // 跳过下载包的部分,直接编译(如果缺少包会报错)


关于GOPATH环境变量

GOPATH 环境变量由 Go 工具使用。必须设置它以便能够getbuildinstall 包,并且它指定工作区的位置。它可能是您在开发 Go 代码时需要设置的唯一环境变量。

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

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

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

【讨论】:

  • go install 会在模块感知设置中下载包。
【解决方案3】:

请注意,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 标志将始终启用

【讨论】:

  • 也许我只是不知道这背后的原因......但我不明白你为什么要禁用单个构建/安装命令。这与我见过的任何其他包管理器都不同
  • @TrevorJex 重读github.com/golang/go/issues/40276,仍然有一个构建/安装命令:go install。它会这样做,以特定版本安装软件包,而不管当前模块上下文如何。与旧的 go get 相比,这是一个改进。
猜你喜欢
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 2016-07-30
  • 2023-02-09
  • 2014-07-27
  • 2019-12-14
  • 2016-12-13
  • 2014-02-24
相关资源
最近更新 更多