我们好,我是煎鱼。

不知道我们平时在调整 Go 环境变量是怎么设置的呢,还是说都用默许装备,又或是直接走 IDE 设置?

Go 环境变量发展进程

像曾经最早时,有的同学是打开 ~/.zshrc,一番 vim 操作,设置好 export GO111MODULE=on。最终再 source 一下。虽然简单,其实也是有好几个过程的:

$ vi ~/.zshrc
$ export GO111MODULE=on
$ source ~/.zshrc

到了近年,Go 支撑运用 go env -w 去设置对应的 Go 环境变量:

$ go env -w GO111MODULE=on

默许写入的途径是:filepath.Join(os.UserConfigDir(), "go/env")。对应不同的操作系统:

  • MacOS:$HOME/Library/Application Support/go/env
  • Linux:$HOME/.config/go/env

通过几年演进,Go 环境变量的设置逐渐变得更方便。网上的教程、博客也纷纷改变了写法。

这是截至目前的 Go 环境变量的进程。

Go1.21 go.env 诞生

不太好的地方

我们会发现,Go 现在的环境变量是越来越多了…假如都是用 go env -w 慢慢的就会越积累越多,装备也就变得复杂了起来。

别的较为扎手的还有不同的 Go 项目之间的所需装备或许不太一样,产生交叉影响。也是一个影响点。

这让我想起了 Python 曾经没有虚拟环境时的痛苦。Go 像是在 GO111MODULE 环境变量,会默许运用 auto 来躲避这个问题。会相较之轻微许多。

无论是轻还是重,问题还是存在的。

引进改进措施

因此在 Go1.21 这个新版本起,将会以用户设置的 $GOROOT/go.env 为更高优先级,会覆盖默许的设置。

既有的 GOPROXY、GOSUMDB 装备将会挪动到 go.env 文件中,文件内容如下:

GOPROXY=https://proxy.golang.org,direct
GOSUMDB=sum.golang.org
GOTOOLCHAIN=auto
...

有了 go.env 文件后,后续就可以运用他来替代默许变量或手动设置的过程了。

有些瑕疵点

目前 Go1.21 只是引进了 $GOROOT/go.env 这一个全局的 ENV 装备文件。看着也有些瑕疵。为什么?

一般来讲要做完整,应该要做到模块(go.mod)的等级,也便是每个 Go 应用有一个 go.env,这样子才能够完全的完成项目(模块)等级的阻隔。

但很可惜,Go 新版本这次把这个部分给暂时抛弃了。由于每个模块引进 go.env 会涉及太多的太多重大问题。

例如:

  • 为什么引进一个独自的文件(go.env)而不是扩展 go.work?
  • 在模块的 go.env 中是否答应一切的 Go 环境变量?
  • 是否有一个选项来禁用模块的 go.env? 或许这个新的 go.env 应该被默许疏忽?
  • GoEnv 的具体意义?
  • 需求一些东西?协助用户调试,告知他们最终取得的 Go 环境变量的过程和来自哪里,由于现在有太多的途径了。

相反引进 $GOROOT/go.env 会愈加明确和没什么争议,毕竟还是局限于既有体系下的全局装备源的新增支撑。

归纳来看,最终 Russ Cox 迅速躺平,取消了模块(go.mod)等级的 go.env 支撑。接受了此次提案的调整。

总结

各个编程言语的装备项和依赖办理一直是一大心魔,前有 Python3 运用 venv(虚拟环境)来处理。后有 Go,先是 godep,接着靠 Russ Cox 力排众议推 Go modules(go.mod)来处理依赖办理。

接下来便是 Go 的装备项的逐渐调整了,这个阻力相对于依赖办理小许多。相信不需求太久,各模块很快就会答应有自己的 go.env 文件,来完成装备阻隔。

我们可以继续重视!先从 $GOROOT/go.env 开始跟进。

文章继续更新,可以微信搜【脑子进煎鱼了】阅览,本文 GitHub github.com/eddycjy/blo… 已收录,学习 Go 言语可以看 Go 学习地图和路线,欢迎 Star 催更。

Go 图书系列

  • Go 言语入门系列:初探 Go 项目实战
  • Go 言语编程之旅:深入用 Go 做项目
  • Go 言语规划哲学:了解 Go 的为什么和规划思考
  • Go 言语进阶之旅:进一步深入 Go 源码

引荐阅览

  • Go1.21 速览:新内置函数 clear、min、max 和新规范库包 cmp!
  • Go1.21 速览:过了一年半,slices、maps 泛型库终于要加入规范库。。。
  • Go1.21 速览:Go 终于计划进一步支撑 WebAssembly 了。。。