Go语言-关于 go get 和 go install

Go语言-关于 go get 和 go install

一直以来,我们通常都是通过 go get 来下载并安装包的。但从 Go 1.16 起,不推荐通过 go get 来安装包(主要是说安装可执行文件),也就是说,go get 应该只是用来下载包,而且将来版本可能会给该命令始终加上 -d 标志。

Go 1.16 中包含着大量的 Modules 相关的更新,详细内容可直接查看其 Release Note[2]。整体而言,包含以下要点:

  • GO111MODULE 默认为 on ,如果要恢复到之前的行为,则需要将 GO111MODULE 设置为 auto ,这样差不多意味着 GOPATH 模式要逐步淡出人们的视野了;

  • go install 命令可以接受一个版本后缀了,(例如,go install sigs.k8s.io/kind@v0.9.0),并且它是在模块感知的模式下运行,可忽略当前目录或上层目录的 go.mod 文件。这对于在不影响主模块依赖的情况下,安装二进制很方便;

  • 在将来,go install 被设计为“用于构建和安装二进制文件”, go get 则被设计为 “用于编辑 go.mod 变更依赖”,并且使用时,应该与 -d 参数共用,在将来版本中 -d 可能会默认启用;

  • go build 和 go test 默认情况下不再修改 go.mod 和 go.sum。可通过 go mod tidy ,go get 或者手动完成;

总结而言,关于 go install 和 go get 必须要注意的是:

  • 基本上 go install @ 是用于命令的全局安装:
    例如:go install sigs.k8s.io/kind@v0.9.0;
  • go get 安装二进制的功能,后续版本将会删除;
  • go get 主要被设计为修改 go.mod 追加依赖之类的,但还存在类似 go mod tidy 之类的命令,所以使用频率可能不会很高;

go get 存在的问题

到目前为止,Go 一直使用 go get 命令,将我们需要的工具安装到 $GOPATH/bin 目录下,但这种方式存在一个很严重的问题。go get 由于具备更改 go.mod 文件的能力,因此我们必须要避免执行 go get 命令时,让它接触到我们的 go.mod 文件 ,否则它会将我们安装的工具作为一个依赖更新到go.mod文件中。

目前的解决方案通常是:我们切换到非go mod项目目录的临时目录下,执行go get。

自 1.16 开始,我们可以直接使用go install,完全不用切换目录。go install 不会更新go.mod文件。

需要注意的是 go install <package>@<version> 是从 1.16 开始增加的,无论你当前是否在一个模块下,此命令都会在 $GOPATH/bin 下安装指定版本的工具。

此外由于 Go 1.16 中 GO111MODULE 默认是打开的,go install 不会修改 go.mod 之类的文件,不会造成任何意外。

当你第一次执行 go install 命令的时候,因为本地无缓存,需要下载所有的依赖模块,所以安装速度会比较慢,请你耐心等待。

参考

Go 1.16 中关于 go get 和 go install 你需要注意的地方
参考URL: https://zhuanlan.zhihu.com/p/338011682
[推荐]Go 1.16 中关于 go get 和 go install 需要注意的地方
参考URL: https://www.bilibili.com/video/av500669206/

相关推荐

  1. Go语言-关于 go get go install

    2024-03-18 05:24:05       43 阅读
  2. 关于gorust语言的对比

    2024-03-18 05:24:05       24 阅读
  3. Go语言热重载优雅地关闭程序

    2024-03-18 05:24:05       36 阅读
  4. 关于Go语言的底层,Slice,map

    2024-03-18 05:24:05       54 阅读
  5. Go语言关于go get, go install, go build, go run指令

    2024-03-18 05:24:05       47 阅读
  6. Go】探索Go语言中的关于defer的应用

    2024-03-18 05:24:05       45 阅读
  7. Go语言教程案例

    2024-03-18 05:24:05       40 阅读
  8. Go语言 字符串数组

    2024-03-18 05:24:05       29 阅读
  9. Go语言 流程控制循环语句

    2024-03-18 05:24:05       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-18 05:24:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-18 05:24:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-18 05:24:05       82 阅读
  4. Python语言-面向对象

    2024-03-18 05:24:05       91 阅读

热门阅读

  1. 新一代云原生数据库OLAP

    2024-03-18 05:24:05       41 阅读
  2. 微软 CEO Satya Nadella 的访谈

    2024-03-18 05:24:05       31 阅读
  3. C++/CLI学习笔记5(快速打通c++与c#相互调用的桥梁)

    2024-03-18 05:24:05       42 阅读
  4. Vue3项目随笔

    2024-03-18 05:24:05       38 阅读
  5. [C++] 实现Union

    2024-03-18 05:24:05       43 阅读
  6. struct 和 union 的区别?

    2024-03-18 05:24:05       39 阅读
  7. iOS——【Blocks】

    2024-03-18 05:24:05       36 阅读
  8. -bash-4.2$

    2024-03-18 05:24:05       44 阅读
  9. c语言:苹果和虫子

    2024-03-18 05:24:05       46 阅读
  10. 2022蓝桥杯/a进制转十进制/c\c++

    2024-03-18 05:24:05       40 阅读
  11. Mysql关于同时使用Group by 和Order by问题

    2024-03-18 05:24:05       44 阅读
  12. html元素基本使用

    2024-03-18 05:24:05       50 阅读