首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >go get和go安装有什么区别?

go get和go安装有什么区别?
EN

Stack Overflow用户
提问于 2014-07-22 04:06:42
回答 3查看 88K关注 0票数 129

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

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

一段软件,而go install只是简单地

  1. 编撰
  2. 并安装

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-22 04:19:34

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

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

据我所知,go get没有表示不应该下载的标志,因此不能在这里替换go install

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

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

不管有没有版本后缀(如上面所述),go install现在是在模块模式下构建和安装包的推荐方法。go get应该与-d标志一起使用,以调整当前模块的依赖关系,而无需构建包,并且不推荐使用go get来构建和安装软件包。在将来的版本中,将始终启用-d标志。

票数 124
EN

Stack Overflow用户

发布于 2017-09-07 07:33:22

go get按照这个顺序做了两件主要的事情:

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

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

的差异:

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

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

关于GOPATH 环境变量的讨论

Go工具使用GOPATH环境变量。为了能够使用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\

票数 53
EN

Stack Overflow用户

发布于 2020-11-12 08:21:51

请注意,go 1.16 (Q1 2021)将使这种差异更加清晰,用CL 266360作为第40276期的一部分实现。

go install现在接受带有版本后缀的参数(例如,go install example.com/cmd@v1.0.0)。 这导致go install以模块感知模式构建和安装软件包,忽略当前目录或任何父目录中的文件(如果存在的话)。 这对于在不影响主模块的依赖关系的情况下安装可执行文件非常有用。 不管有没有版本后缀(如上面所述),go install现在是在模块模式下构建和安装包的推荐方法。 go get应该与-d标志一起使用来调整当前模块的依赖关系,而不需要构建包,而使用 go get 来构建和安装包是不推荐的。 在未来的版本中,标志将始终被启用

2022年6月(在1.19之前走1.18 ),希本曼详细介绍了"‘可以安装“。

它涉及一个带有指令的模块。

如果您克隆存储库并在其中运行“go install”,一切都会正常工作,您的$HOME/go/bin中就会有一个gospy二进制文件。 但是,正如我们在这里看到的,'go install ...@latest‘的工作方式非常不同,以至于替换指令导致了这个错误。

它触发错误消息:

代码语言:javascript
复制
go: github.com/monsterxx03/gospy@latest (in github.com/monsterxx03/gospy@v0.5.0):
    The go.mod file for the module providing named packages contains one or
    more replace directives. It must not contain directives that would cause
    it to be interpreted differently than if it were the main module.

“去安装”的帮助显式地描述了这种模式:

没有模块被认为是"main“模块。 如果包含在命令行中命名的包的模块有一个go.mod文件,那么它不能包含指令(replaceexclude),这些指令会导致与主模块不同的解释。 模块不能要求更高版本的自身。

请参见:

  • 第44840期cmd/go:当带有main包的模块有replace指令时,go install cmd@version出错
  • 第40276期cmd/gogo install应该在模块外部以模块模式安装可执行文件
  • 第45099期x/tools/gopls:无法安装gopls v0.6.8 (说明问题)

建议:

切换到使用围棋工作空间进行本地开发,并完全删除go.mod replace指令。

正如熟悉工作空间贝丝·布朗所提到的

以前,要向一个模块添加一个特性并在另一个模块中使用它,您需要将更改发布到第一个模块,或者发布依赖模块的文件,并为本地未发布的模块更改提供replace指令。 为了不出现错误,您必须在将本地更改发布到第一个模块之后,从依赖模块的go.mod文件中删除go.mod指令。 使用Go工作区,您可以使用工作区目录根目录中的go.work文件控制所有依赖项。 该go.work文件具有usereplace指令,重写单独的文件,因此不需要单独编辑每个go.mod文件。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24878737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档