go get和go install之间有什么区别?
在使用go get和go install之间有什么区别?,go,Go,在使用go工具一段时间后,它看起来像go-get: (可选)下载 汇编 安装 一个软件,而只需安装 汇编 安装 它。在这种情况下,go-install命令为什么会存在,因为go-get取代了它?go-install是本地工作流程的一部分。假设您想使用一个库,但由于某些原因需要进行更改。你会做: go get-d库,它只下载它 对下载的软件包进行更改 转到安装库安装本地版本 据我所知,go-get没有任何标志表明它不应该下载,因此它不能在这里替换go-install 当您从头开始开发新包时,使
go
工具一段时间后,它看起来像go-get
:
只需安装
它。在这种情况下,
go-install
命令为什么会存在,因为go-get
取代了它?go-install
是本地工作流程的一部分。假设您想使用一个库,但由于某些原因需要进行更改。你会做:
,它只下载它李>go get-d库
- 对下载的软件包进行更改李>
安装本地版本转到安装库
go-get
没有任何标志表明它不应该下载,因此它不能在这里替换go-install
当您从头开始开发新包时,使用相同的工作流
编辑:6年后,Go 1.16更新并澄清了
Go install
和Go get
的用法:Go get
按此顺序执行两项主要操作:
- 下载并将导入路径中命名的包(源代码)及其依赖项保存在
中,然后$GOPATH/src/
- 执行
go安装
-d
标志(go-get-d
)指示下载包后停止go-get
;也就是说,它指示go-get
不要执行go-install
区别:
go get
//验证是否需要下载软件包,如果需要下载,然后编译
go install
//跳过下载包的部分,只需编译即可(如果缺少任何包,这将引发错误)
关于
GOPATH
环境变量
Go工具使用GOPATH
环境变量。必须设置它才能获取
、构建
和安装
软件包,并指定工作区的位置。它可能是开发Go代码时需要设置的唯一环境变量
同样,GOPATH
不应该指向Go安装,而是指向您的工作区
例如,在Windows上,如果您决定您的工作区位于c:\gowork\
,则需要将GOPATH
值设置为c:\gowork
您的源代码应该位于c:\gowork\src\\\\
中,运行后,在命令提示符下从c:\gowork\src\\\\
中获取,您将看到c:\gowork\bin\\
和c:\gowork\pkg\\
正在创建中。注意,这将使差异更加清楚,作为以下部分实现:
go install
现在接受带有版本后缀的参数(例如,go install example.com/cmd@v1.0.0
)。
这会导致go install
以模块感知模式构建和安装软件包,忽略当前目录或任何父目录(如果有)中的go.mod
文件。
这对于在不影响主模块依赖关系的情况下安装可执行文件非常有用
go install
,无论是否带有版本后缀(如上所述),现在是以模块模式构建和安装软件包的推荐方式
go-get
应与-d
标志一起使用,以调整当前模块的依赖关系,而无需构建软件包,不推荐使用go-get
构建和安装软件包
在未来版本中,-d
标志将始终处于启用状态
很好,我想我现在明白了,多亏了你的第一个例子。但是,在您的第二个软件包(从头开始开发新软件包)中,我也可以使用go-get./path/to/local\u-package
,它的行为与我使用go-install./path/to/local\u-package
的行为相同,对吗?因为在这种情况下没有下载过程。go install
使您的目标更加明确,但我认为两者都可以实现相同的目标。我用几个包进行了测试,包括声明为main
的包,它们看起来是等价的。这个命令上的文档非常缺乏。它说,go-get
需要gcc,但go-install
不需要gcc。这与这个描述有什么关系?我不同意这个答案。您也可以在第三个要点中使用go-get
而不是go-install
,因为go-get
不会重新下载库(除非添加-u
)。从头开始编写库时,也可以使用go-get
go install
似乎完全多余。go install
确实在模块感知设置中下载了该软件包。也许我只是不知道这背后的原因。。。但我不明白为什么要禁用单个构建/安装命令。这与我见过的任何其他包管理器都不同seen@TrevorJex重新阅读,仍然有一个生成/安装命令:go install
。它会这样做,在特定版本安装包,而不管当前模块上下文如何。与旧的go-get
相比,这是一个改进。