简洁的 Go 多版本管理机制
消息来源:baojiabao.com 作者: 发布时间:2024-05-07
一门充满生机的编程语言,一定是不断进化向前的。随着 Go 项目的持续发展,而且每个大版本内还会有不少小版本的迭代。对于 Go 的版本更新,我们该如何做好多版本管理。
多版本管理的重要性
这里简单列举几个我们需要 Go 多版本管理的理由。
稳定性考量:虽然 Go1 一直在良好地遵守向后兼容准则,但通常基于稳定性考虑,我们并不会直接升级到最新版本。
多项目开发:各项目依赖的 Go 版本不一致。
版本兼容:测试代码前后兼容性,或者确保 bug 修复在不同 Go 版本的正确性,对于开源项目,保证版本兼容性非常重要。
如何多版本管理
我们需要有两个先决条件
已经安装好了某版本的 Go
安装好了 git
安装
运行 go install golang.org/ dl / go
$ go install golang.org/dl/go@latest
通过包装器,下载特定 Go 版本和它对应的工具链。
$ godownload
例如安装 1.14.12 版本,可以这样执行。
$ go install golang.org/dl/go1.14.12@latest$ go1.14.12 download
使用
使用包装器 go1.14.12,我们可以基于 Go v1.14.12 进行构建和测试。
$ go1.14.12 mod init hellogo: creating new go.mod: module hello$ echo 'package main; import "fmt"; func main() { fmt.Println("Hello, World") }' hello.go$ go1.14.12 build$ ./helloHello, World
当然,如果你想让 Go v1.14.12 "喧宾夺主",成为 go 命令的代言人,可以这样做。
$ go versiongo version go1.17 darwin/64$ export GOROOT=$(go1.14.12 env GOROOT)$ export PATH=${GOROOT}/bin:$PATH$ go versiongo version go1.14.12 darwin/64
这个 go1.14.12 env GOROOT 路径就是 Go v1.14.12 版本的内容。所以,如果我们想卸载这个版本,直接将该路径文件夹删除即可;想阅读该版本源码,直接查看该路径下的 src / 内容即可 。
获取最新开发版本
有一个特别的版本标记:gotip,它用于安装最新的开发版本。
$ go install golang.org/dl/gotip@latest$ gotip download
可以看到,当前拉取到的最新的开发版本是 go1.18-1afa432。
实现思路
实现多版本下载安装的秘诀就在于 https://go.googlesource.com/ dl 这个仓库,https://github.com/ golang / dl 是它的镜像库。
查看仓库代码,我们能看到一系列版本目录
随意选择一个版本进入,会发现存在一个 main.go 文件
而 main.go 文件内容如下
我们通过 go install golang.org/ dl / go1.14.12@latest 下载的 go1.14.12 包装器就是这个 main.go 编译而成。
因此,我们后续通过 go1.14.12 包装器下载和运行的逻辑就在于 internal / version 包中的 Run 方法了。
// Run runs the "go" tool of the provided Go version.func Run(version string) { log.SetFlags(0) // 获取 Go 安装目录 root, err := goroot(version) if err != nil { log.Fatalf("%s: %v", version, err) } // 执行 godownload 命令时逻辑 if len(os.Args) == 2 && os.Args[1] == "download" { if err := install(root, version); err != nil { log.Fatalf("%s: download failed: %v", version, err) } os.Exit(0) } // 判断该版本 Go 安装状态 if _, err := os.Stat(filepath.Join(root, unpackedOkay)); err != nil { log.Fatalf("%s: not downloaded. Run '%s download' to install to %v", version, version, root) } // 运行该版本 Go runGo(root)}
鉴于篇幅原因,下载的 install 和运行的 runGo 函数逻辑本文就不再展开了,想深入了解的同学可以自行探索。
另外,为了让每个版本都有一个 Go 包装器主程序(避免重复的手工操作),这里使用了一个帮助命令 genv:可以快速生成对应版本的包装器代码
总结
本文介绍了 Go 官方提供的多版本管理方案,包括使用、安装、卸载等,可以感受到它的简洁与高效。同时我们简单查看了这一套实现代码逻辑。
最后,希望本文内容能够助你用好 Go 多版本管理。
本文来自微信公众号:Golang 技术分享 (ID:GolangShare),作者:机器铃砍菜刀
2022-12-21 17:03:27相关文章
- 美国法院裁定阿里须为Squishmallows玩具侵权案答辩
2023-12-28 19:59:34
- 小米汽车传员工3700人 雷军称小米汽车不可能卖9万9
2023-12-28 19:41:57
- 国家新闻出版署:认真研究《网络游戏管理办法(草桉徵求意见稿)》关切 实行前进一步完善
2023-12-28 19:14:56
- 天猫新规可以无条件申请“仅退款”了?淘宝天猫又离狗多多零元购近了一步
2023-12-28 18:57:55
- 印度以打击金融犯罪为由逮捕了两名 vivo 高管
2023-12-26 16:49:01
- 在国外微信收不到国内信息?微信和WeChat将被拆分
2023-12-15 10:40:15
- 苹果iPhone15 系列手机发布最新消息 预计上市发布时间9月
2023-08-06 23:21:02
- 华为将发布鸿蒙HarmonyOS4操作系统 功能五大升级支持设备清单
2023-08-06 23:17:37
- 整治自媒体网红账号 400万粉丝网红发布擦边视频被无限期封禁
2023-07-12 09:56:09
- 网传微信文件传输助手是真人是真的吗?微信官方回应
2023-06-27 15:53:32
- 电信移动送手机成了“信用购”?你上了运营商的贷款套路了吗?
2023-06-12 17:18:55
- 中国电信广东地区崩了无信号 客服回应已在核实处理
2023-06-08 15:39:04
- 消息称小米新能源汽车价格表正讨论定价区间:双版本不同配置,高配或超 35 万元
2023-03-06 12:56:03
- 华为因制裁被传或分拆剥离手机业务? 内部人士回应:可能性不大.
2023-03-05 23:26:41
- OPPO正式发布安第斯智能云,让终端更智能
2023-02-24 16:02:27
- 华为与OPPO签订全球专利交叉许可协议 包括5G蜂窝通信专利
2023-02-24 16:02:26
- 老蛙将推MINI镜头新品:目前未知具体规格 官宣将于12月20日发布
2023-02-24 16:02:26
- 首发全新35mm定制光学系统 努比亚Z50性能同样强悍
2023-02-24 16:02:25
- Redmi K60屏幕细节曝光:全系标配2K护眼柔性直屏+5000mAh大容量电池
2023-02-24 16:02:25
- OPPO Find N2今天发 合金金属折叠屏更轻了
2023-02-24 16:02:24