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

相关推荐
豆浆Whisky6 小时前
Go微服务通信优化:从协议选择到性能调优全攻略|Go语言进阶(20)
后端·微服务·go
码一行1 天前
Eino AI 实战:解析 PDF 文件 & 实现 MCP Server
后端·go
赵大海2 天前
golang运维平台实战,服务树,日志监控,任务执行,分布式探测
go
喵个咪2 天前
go-kratos-admin 快速上手指南:从环境搭建到启动服务(Windows/macOS/Linux 通用)
vue.js·go
码一行2 天前
Eino AI 实战: Eino 的文档加载与解析
后端·go
码一行2 天前
Eino AI 实战:DuckDuckGo 搜索工具 V1 与 V2
后端·go
代码扳手2 天前
Golang 高效内网文件传输实战:零拷贝、断点续传与 Protobuf 指令解析(含完整源码)
后端·go
zhuyasen3 天前
Go Web 开发利器:如何让你的 Gin 服务拥有 Nginx 般的静态文件处理能力?
nginx·go·gin
爷_3 天前
Golang: sqlc 和 goose 最佳实践
后端·go·全栈