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
- bash:
手动安装(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
- bash:
手动安装(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> 来使用 Debug 或 Trace 等级.
FAQ
-
编译和安装源代码失败?
所需的Go最低版本取决于Go的目标版本, 更多信息请参见source installation instructions
-
- 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版本.
- exact(
-
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.