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

519 阅读6分钟

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安装.

cargo install goup-rs

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环境变量中.

快速入门

$ 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.

$ goup search
1
...
1.21rc4
1.22rc1
$ goup search stable
1
...
1.21.4
1.21.5
1.21.10

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

$ 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

$ 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版本.

$ 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 版本

$ 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版本.

$ 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

管理缓存归档文件

$ 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安装程序

$ 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`!

环境变量值

$ 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.

goup completion zsh > _goup

更多信息

执行goup -h获取更多信息

镜像站

索引镜像站

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

仓库镜像站

仓库地址支持SHA256文件支持HTTP获取压缩包长度备注
官方1(默认)dl.google.com/go
官方2go.dev/dl
官方3golang.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选项.

设置镜像站环境变量

# 推存值
# 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