Go1.21 速览:支持自定义 go.env 文件,可惜还是有所残缺

开发 前端
像以前最早时,有的同学是打开 ~/.zshrc,一番 vim 操作,设置好 export GO111MODULE=on。最后再 source 一下。

大家好,我是煎鱼。

不知道大家平时在调整 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 开始跟进。也可以加我下方微信,在 Go 技术交流群一起紧跟新技术知识。

责任编辑:武晓燕 来源: 脑子进煎鱼了
相关推荐

2023-06-07 10:32:57

内置函数clear

2023-06-29 08:47:59

GoContext设置

2023-05-05 08:51:18

Go语言泛型

2023-07-05 08:47:24

Go版本团队

2018-04-09 14:26:06

Go语法实践

2022-05-30 08:14:48

编译器Go语言

2022-12-09 08:52:51

Go匿名接口

2023-08-02 08:46:02

Go版本号规则

2023-08-09 08:53:50

GoWASI语义

2020-07-16 08:05:15

JavaGo

2023-03-13 00:10:46

Go语言版本

2011-05-27 09:51:44

Windows Pho应用商店

2009-08-21 15:38:45

ControllerF

2021-02-20 11:40:35

SpringBoot占位符开发技术

2015-02-12 15:33:43

微信SDK

2016-11-16 21:55:55

源码分析自定义view androi

2011-06-23 10:49:13

Qt 自定义信号

2015-02-12 15:38:26

微信SDK

2022-04-06 08:19:13

Go语言切片

2023-02-26 23:36:08

PHPGo函数
点赞
收藏

51CTO技术栈公众号