goup是一个纯Rust编写的优雅的Go多版本管理工具

goup

注意 : goup-rs仍在积极开发中, 因此在达到v1.0.0之前不能保证完全向后兼容

特性

  • 最小依赖, 依赖于git(仅nightly|tip|gotip版本需要git).
  • 跨平台的能力(Linux, macOS & Windows).
  • 支持使用goup install/remove [TOOLCHAIN] 安装/卸载 Go版本.
  • 支持使用goup install <nightly|tip|gotip> 从源码安装Go, 需要git.
  • 支持列出本地已安装的版本.
  • 支持在多个已安装的版本中切换.
  • 支持搜索可用的Go版本.
  • ✨支持在shell会话中使用特定的Go版本(>= v0.15.x).
  • ✨支持多个下载后端GOUP_GO_REGISTRY_INDEX/GOUP_GO_REGISTRY(>=v0.16.x).
  • 支持管理本地缓存文件(如 *.tar.gz, *.tar.gz.sha256).
  • 支持goup自我更新.
  • 支持自定义GOUP_HOME(默认$HOME/.goup)(>= v0.11.x);
  • 友好的提示.
  • 应该很快.

goup 是对上述特性的一种尝试, 其灵感主要来自于 Rustup, golang/dl, goup, goenv, gvm and getgo.

构建功能标志

  • no-self-update 关闭自我更新.

安装

使用Cargo

或者, 也可以使用cargo安装.

shell 复制代码
cargo install goup-rs

shell 复制代码
cargo install goup-rs --git https://github.com/thinkgos/goup-rs
  • (仅支持 Linux/MacOS ) 运行goup init, 获取到shell启动脚本位于$HOME/.goup/env.
  • (仅支持 Linux/MacOS ) 在shell启动脚本中添加Go的bin目录:
    • bash: echo '. "$HOME/.goup/env"' >> ~/.bashrc
    • zsh: echo '. "$HOME/.goup/env"' >> ~/.zshenv
    • fish: echo 'source ~/.goup/env' >> ~/.config/fish/config.fish

手动安装(Linux/MacOS)

如果您想手动安装, 步骤如下:

  • Release Page下载最新的goup.
  • goup可执行文件放到PATH中, 并给予可执行权限: mv GOUP_BIN /usr/local/bin/goup && chmod +x /usr/local/bin/goup
  • 运行goup init, 获取到shell启动脚本位于$HOME/.goup/env.
  • 在shell启动脚本中添加Go的bin目录:
    • bash: echo '. "$HOME/.goup/env"' >> ~/.bashrc
    • zsh: echo '. "$HOME/.goup/env"' >> ~/.zshenv
    • fish: echo 'source ~/.goup/env' >> ~/.config/fish/config.fish

手动安装(Windows)

MSI安装

Release Page下载最新的goup的MSI安装程序并运行.

二进制安装
  • Release Page下载最新的goup的二进制程序并解压.
  • goup.exe移至$YOUR_PATH.
  • $YOUR_PATH加到windows环境变量中.

快速入门

shell 复制代码
$ goup install
[2024-01-30T00:38:48Z INFO ] Installing go1.21.10 ...
[2024-01-30T00:38:48Z INFO ] Unpacking /home/thinkgo/.goup/go1.21.10/go1.21.10.linux-amd64.tar.gz ...
[2024-01-30T00:38:48Z INFO ] go1.21.10 installed in /home/thinkgo/.goup/go1.21.10
[2024-01-30T00:38:48Z INFO ] Default Go is set to 'go1.21.10'
$ goup list
1.21.10  (active, default)
$ go env GOROOT
/home/thinkgo/.goup/current
$ go version
go version go1.21.10 linux/amd64
$ GOUP_GO_REGISTRY_INDEX=https://golang.google.cn goup install =1.21.10

使用方法

列出所有可用的go版本

goup search [FILTER], [FILTER]支持的值: 'stable' , 'unstable' , 'beta'any regex string.

bash 复制代码
$ goup search
1
...
1.21rc4
1.22rc1
$ goup search stable
1
...
1.21.4
1.21.5
1.21.10

列出所有位于$HOME/.goup已安装的Go版本

bash 复制代码
$ goup list 
1.21.10
1.22.3  (active, default)
tip

安装指定Go版本

goup install/update [TOOLCHAIN], [TOOLCHAIN] 支持的值: 'stable'(default) , 'nightly' ('tip' , 'gotip' ), 'unstable' , 'beta''=1.21.4' , --dry 表示只安装对应版本, 但并不切换使用.

[TOOLCHAIN] 支持semver语法匹配对应版本, 详情查看FAQ

bash 复制代码
$ goup install 1.21.*
[2024-01-30T00:38:48Z INFO ] Installing go1.21.10 ...
[2024-01-30T00:38:48Z INFO ] Unpacking /home/thinkgo/.goup/go1.21.10/go1.21.10.linux-amd64.tar.gz ...
[2024-01-30T00:38:48Z INFO ] go1.21.10 installed in /home/thinkgo/.goup/go1.21.10
[2024-01-30T00:38:48Z INFO ] Default Go is set to 'go1.21.10'
$ goup install =1.21.4 --dry
[2024-01-30T00:38:48Z INFO ] Installing go1.21.4 ...
[2024-01-30T00:38:48Z INFO ] Unpacking /home/thinkgo/.goup/go1.21.4/go1.21.4.linux-amd64.tar.gz ...
[2024-01-30T00:38:48Z INFO ] go1.21.10 installed in /home/thinkgo/.goup/go1.21.4

切换到选定的Go版本

goup default/use/set [VERSION], 设置默认的Go版本.

bash 复制代码
$ goup default 
? Select a version ›
  1.21.5
❯ 1.21.10
  tip
[2024-01-30T00:38:48Z INFO ] Default Go is set to 'go1.21.10'

删除指定的 Go 版本列表

goup remove/rm [VERSION]... 删除指定的 Go 版本列表. 如果没有提供版本, 将提示选择多个已安装的 Go 版本

bash 复制代码
$ goup rm
? Select multiple version ›
✔ 1.21.5
⬚ 1.21.10
⬚ tip
✔ Select multiple version · 1.21.5

在shell会话中使用特定的Go版本

goup shell [VERSION], 在shell会话中使用特定的Go版本, 如果没有提供版本, 将自动检测执行路径下的go.work/go.mod的Go版本(可以使用--skip-autodetect跳过), 仍旧没有的话将提示用户选择一个已安装的Go版本.

bash 复制代码
$ goup shell 1.21.10
? Select a version ›
  1.21.5
❯ 1.21.10
  tip
$ go version
go version go1.21.10 linux/amd64
$ goup list 
1.21.10
1.22.3  (active, default)
tip

管理缓存归档文件

bash 复制代码
$ goup cache show --contain-sha256
go1.21.10.linux-amd64.tar.gz
go1.21.10.linux-amd64.tar.gz.sha256

$ goup cache clean
✔ Do you want to clean cache file? · yes

修改goup安装程序

bash 复制代码
$ goup self update
Checking target-arch... x86_64-unknown-linux-gnu
Checking current version... v0.9.0
Checking latest released version... v0.9.0
[2024-01-30T00:38:48Z INFO ] Update status: `v0.9.0`!

环境变量值

bash 复制代码
$ goup env
+------------------------+--------------------------------+--------------------------------------------------------------+
| Key                    | Value                          | Explain                                                      |
+------------------------+--------------------------------+--------------------------------------------------------------+
| GOUP_HOME              | /home/thinkgo/.goup            | Get goup home directory, default: '$HOME/.goup'              |
| GOUP_GO_VERSION        | current                        | Shell session target go version, default: 'current'          |
| GOUP_GO_REGISTRY_INDEX | https://golang.google.cn       | Registry index of go version                                 |
| GOUP_GO_REGISTRY       | https://dl.google.com/go       | Registry of go archive file                                  |
| GOUP_GO_SOURCE_GIT_URL | https://github.com/golang/go   | Source git url, use by tip|nightly or index of go version    |
| GOUP_GO_SOURCE_GIT_URL | https://go.googlesource.com/go | Source upstream git url, use by tip|nightly                  |
+------------------------+--------------------------------+--------------------------------------------------------------+

Shell补全

goup completion <SHELL> 为指定shell生成补全脚本. <SHELL>支持这些值: bash, elvish, fish, powershell, zsh.

bash 复制代码
goup completion zsh > _goup

更多信息

执行goup -h获取更多信息

镜像站

索引镜像站

索引 地址 使用选项--registry-index或环境变量 备注
官方1(默认) go.dev official 或 `official https://go.dev`
官方2 golang.google.cn `official https://golang.google.cn`
官方git 1 github.com/golang/go git 或 `git https://github.com/golang/go`
官方git 2 go.googlesource.com/go `git https://go.googlesource.com/go`
阿里云 mirrors.aliyun.com/golang `ngx-fancy-index https://mirrors.aliyun.com/golang`
南京大学 mirrors.nju.edu.cn/golang `ngx-fancy-index https://mirrors.nju.edu.cn/golang`
华中科技大学 mirrors.hust.edu.cn/golang `ngx-fancy-index https://mirrors.hust.edu.cn/golang`

仓库镜像站

仓库 地址 支持SHA256文件 支持HTTP获取压缩包长度 备注
官方1(默认) dl.google.com/go
官方2 go.dev/dl
官方3 golang.org/dl
阿里云 mirrors.aliyun.com/golang
南京大学 mirrors.nju.edu.cn/golang
华中科技大学 mirrors.hust.edu.cn/golang
中国科学技术大学 mirrors.ustc.edu.cn/golang ❌ 不建议使用

NOTE : 有些镜像站不提供SHA256校验文件 , 在下载时需要使用--skip-verify选项.

设置镜像站环境变量

shell 复制代码
# 推存值
# export GOUP_GO_REGISTRY_INDEX='ngx-fancy-index|https://mirrors.nju.edu.cn/golang'
# export GOUP_GO_REGISTRY_INDEX='git|https://github.com/golang/go'
export GOUP_GO_REGISTRY_INDEX=https://go.dev
export GOUP_GO_REGISTRY=https://mirrors.hust.edu.cn/golang

工作原理

  • goup completion <SHELL> 为指定shell生成补全脚本.
  • goup [help] 打印此信息或给定子命令的帮助信息.
  • goup install/update/i [TOOLCHAIN] 下载指定的Go版本到$HOME/.goup/go<VERSION|tip>/go并创建一个软链接到$HOME/.goup/current.
  • goup default/use/set [VERSION] 设置默认的Go版本.
  • goup ls/list/show 列出所有位置$HOME/.goup已安装的Go版本.
  • goup remove/rm [VERSION]... 移除指定的Go版本列表.
  • goup search/ls-remote [FILTER] 列出所有可用的Go版本.
  • goup cache [COMMAND] 管理缓存归档文件.
  • goup self <COMMAND> 修改goup安装程序.
  • goup init [SHELL] 将所有必要的环境变量和值写入$HOME/.goup/env.
  • goup env 显示goup的环境变量和值.
  • goup shell [VERSION] 在shell会话中使用特定的Go版本.

How to Debug

默认日志级别为Info. 你可以使用goup -v <subcommand>goup -vv <subcommand> 来使用 DebugTrace 等级.

FAQ

  • 编译和安装源代码失败?

    所需的Go最低版本取决于Go的目标版本, 更多信息请参见source installation instructions

  • semver

    • exact(=): 允许更新到与版本完全一致的最新版本, 因此=1.21.4表示与版本1.21.4完全一致.
    • greater(>): 允许更新到大于该版本的最新版本, 因此>1.21.4表示大于1.21.4.
    • greater equal(>=): 允许更新到大于或等于该版本的最新版本, 因此 >1.21.4 表示大于或等于1.21.4.
    • less(<): 允许更新到小于该版本的最新版本, 因此>1.21.4表示大于1.21.4.
    • less equal(<=): 允许更新到小于或等于该版本的最新版本, 因此 >1.21.4 表示小于或等于1.21.4.
    • tilde(~): 允许更新到不改变主,次版本的最新版本, 因此~1.21.4表示大于或等于 1.21.4, 但小于 1.22.0.
    • caret(^): 允许更新到不改变主要版本的最新版本, 因此 ^1.21.4 表示版本必须大于或等于 1.21.4, 但小于 2.0.0.
    • wildcard(*): 此运算符表示任意版本. 它通常用于允许所有版本号匹配.
      • 1.21.* 匹配所有1.21.x版本.
      • 1.*.* 匹配所有1.x.x版本.
  • Go版本小于等于1.20.x解压失败.

    大于v0.10.3版本已解决. 看多信息查看issue #251

  • 如何自定义 GOUP_HOME? (>= v0.11.x)
    goup使用$HOME/.goup目录作为 GOUP_HOME. 如果需要自定义GOUP_HOME(大多数是Windows用户), 可以设置GOUP_HOME环境变量来使用其他目录, 安装goup之前, 请确保已设置自定义GOUP_HOME环境变量和目标目录权限, 否则可能会导致令人惊讶的结果, 请参阅issue #265 #270

  • 有一些版本没有sha256文件, 如何安装这些版本? goup(>= v0.12.x) 支持 --skip-verify 选项, 如果这些版本没有sha256文件, 你可以尝试添加选项. 请参阅issue #300 #301 #305

  • 如何安装特定版本? 为什么会出现错误Error: expected comma after minor version number, found 'r'? 有时, 我们知道确切的版本, 可以使用 goup install =1.24.5, 但有些版本不符合semver, 如 1.25rc1, 我们可以使用goup install unstable, 但这只能安装最新的不稳定版本. 所以我添加了一个 --use-raw-version 选项(>= v0.12.x), 这样我们就可以安装任何我们确切知道的版本. 请参阅issue #299 #307

  • 如何在shell会话中使用特定的Go版本? goup(>= v0.15.x) 支持在一个shell会话中指定go版本. 如果你使用goup shell, 在*nix系统上需要先运行goup init, 因为之前的env文件较旧且不包含GOUP_GO_VERSION环境变量. 在Windows系统 上, 仅支持powershell, 如果系统的COMSPEC已经指向 powershell, 可能无需做任何操作. 请参阅issue #360.

原文

goup-rs

相关推荐
却尘13 小时前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤13 小时前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt111 天前
AI DDD重构实践
go
Grassto3 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto4 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室5 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题5 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo
啊汉7 天前
古文观芷App搜索方案深度解析:打造极致性能的古文搜索引擎
go·软件随想
asaotomo8 天前
一款 AI 驱动的新一代安全运维代理 —— DeepSentry(深哨)
运维·人工智能·安全·ai·go
码界奇点8 天前
基于Gin与GORM的若依后台管理系统设计与实现
论文阅读·go·毕业设计·gin·源代码管理