全部版块 我的主页
论坛 数据科学与人工智能 IT基础
37 0
2025-12-02

goup 是一款高效的 Go 版本管理工具,具备以下核心功能:

  • 依赖极简,仅需依赖于
    git
    (仅
    nightly|tip|gotip
    版本需要
    git
    )。
  • 支持跨平台运行,兼容 Linux、macOS 和 Windows 系统。
  • 可通过
    goup install/remove [TOOLCHAIN]
    方式安装或卸载指定的 Go 版本。
  • 支持从源码构建安装 Go,此功能需系统已安装
    git
  • 可列出当前本地已安装的所有 Go 版本。
  • 允许在多个已安装版本之间自由切换。
  • 支持搜索远程可用的 Go 发行版本。
  • ? 提供 shell 会话级的版本控制能力(>= 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 以及 getgo。

构建特性标志

可通过编译选项关闭自我更新功能:

no-self-update
—— 禁用自动更新机制。

安装方式

通过 Cargo 安装

推荐使用 Cargo 进行安装:

cargo install goup-rs

或从 GitHub 仓库直接安装:

cargo install goup-rs --git https://github.com/thinkgos/goup-rs

(仅支持 Linux/macOS)
安装完成后运行

goup init
,获取 shell 启动脚本路径
$HOME/.goup/env

随后将 Go 的 bin 目录添加至 shell 配置中:

Bash:

echo '. "$HOME/.goup/env"' >> ~/.bashrc

Zsh:

echo '. "$HOME/.goup/env"' >> ~/.zshenv

Fish:

echo 'source ~/.goup/env' >> ~/.config/fish/config.fish

手动安装(Linux/macOS)

  1. 前往 Release 页面下载最新的
    goup
    可执行文件。
  2. 将其移至
    PATH
    并赋予执行权限:
    mv GOUP_BIN /usr/local/bin/goup && chmod +x /usr/local/bin/goup
  3. 运行
    goup init
    获取 shell 初始化脚本位置
    $HOME/.goup/env
  4. 将 Go 的 bin 路径加入 shell 启动脚本:

Bash:

echo '. "$HOME/.goup/env"' >> ~/.bashrc

Zsh:

echo '. "$HOME/.goup/env"' >> ~/.zshenv

Fish:

echo 'source ~/.goup/env' >> ~/.config/fish/config.fish

Windows 手动安装

MSI 安装方式

从 Release 页面下载最新版

goup
的 MSI 安装包并运行即可完成安装。

二进制解压方式
  1. 从 Release 页面下载最新的
    goup
    二进制压缩包并解压。
  2. 将解压后的
    goup.exe
    文件移动到
    $YOUR_PATH
    目录下。
  3. $YOUR_PATH
    添加至系统的环境变量 PATH 中。

快速入门示例

$ 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’ 或任意正则表达式字符串。

示例:

$ goup search 1
...
1.21rc4
1.22rc1

$ goup search stable
1
...
1.21.4
1.21.5
1.21.10

列出已安装的 Go 版本

查询位于

$HOME/.goup
路径下的所有已安装 Go 版本:

$ goup list
1.21.10
1.22.3  (active, default)
tip

安装指定版本的 Go

支持如下格式进行安装:

goup install/update [TOOLCHAIN]

[TOOLCHAIN]

可接受的值包括:
‘stable’(默认)、‘nightly’(即 ‘tip’ 或 ‘gotip’)、‘unstable’、‘beta’、‘=1.21.4’ 等。

附加说明:

--dry
表示仅安装该版本而不激活切换。
[TOOLCHAIN]
支持
semver
语法匹配目标版本,更多细节请参考 FAQ 文档。

示例:

$ goup install 1.21.*
git

nightly|tip|gotip

goup install/remove [TOOLCHAIN]

goup install <nightly|tip|gotip>

GOUP_GO_REGISTRY_INDEX

GOUP_GO_REGISTRY

*.tar.gz

*.tar.gz.sha256

goup

GOUP_HOME

$HOME/.goup

goup

no-self-update

cargo

goup init

$HOME/.goup/env

echo '. "$HOME/.goup/env"' >> ~/.bashrc

echo '. "$HOME/.goup/env"' >> ~/.zshenv

echo 'source ~/.goup/env' >> ~/.config/fish/config.fish

PATH

mv GOUP_BIN /usr/local/bin/goup && chmod +x /usr/local/bin/goup

goup.exe

$YOUR_PATH

goup search [FILTER]

[FILTER]

$HOME/.goup

goup install/update [TOOLCHAIN]

[TOOLCHAIN]

--dry

semver

[2024-01-30T00:38:48Z INFO ] 正在安装 go1.21.10 ...
[2024-01-30T00:38:48Z INFO ] 正在解压 /home/thinkgo/.goup/go1.21.10/go1.21.10.linux-amd64.tar.gz ...
[2024-01-30T00:38:48Z INFO ] go1.21.10 已成功安装至 /home/thinkgo/.goup/go1.21.10
[2024-01-30T00:38:48Z INFO ] 默认 Go 版本已设置为 'go1.21.10'

执行如下命令可预览安装过程:
$ goup install =1.21.4 --dry

[2024-01-30T00:38:48Z INFO ] 正在安装 go1.21.4 ...
[2024-01-30T00:38:48Z INFO ] 正在解包文件 /home/thinkgo/.goup/go1.21.4/go1.21.4.linux-amd64.tar.gz ...
[2024-01-30T00:38:48Z INFO ] go1.21.10 已安装于 /home/thinkgo/.goup/go1.21.4

切换并设定默认的 Go 版本

通过交互式选择器指定系统默认使用的 Go 版本。

$ goup default
? 请选择一个版本?
  1.21.5
* 1.21.10
tip
[2024-01-30T00:38:48Z INFO ] 默认 Go 版本已更新为 'go1.21.10'
goup default/use/set [VERSION]

移除已安装的 Go 版本

支持从系统中删除指定的多个 Go 版本。若未直接指定版本号,将进入多选模式供用户挑选。

$ goup rm
? 请选择要删除的多个版本?
? 1.21.5
? 1.21.10
? tip
? 已选择版本 · 1.21.5
goup remove/rm [VERSION]...

在当前 Shell 会话中使用特定 Go 版本

允许临时切换当前终端会话所使用的 Go 版本。若未明确指定版本,工具将尝试根据当前路径下的项目配置自动识别所需版本(可通过特定方式跳过此步骤),若仍无法确定,则提示用户手动选择。

$ goup shell 1.21.10
? 请选择版本?
  1.21.5
* 1.21.10
tip

$ go version
go version go1.21.10 linux/amd64
goup shell [VERSION]
go.work
go.mod
--skip-autodetect

查看已安装的 Go 版本列表

列出所有已安装的 Go 版本,并标注当前激活及默认版本。

$ 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
? 确认清除缓存文件? · yes

更新 goup 自身程序

检查并升级 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 ] 更新状态:已是最新版本 `v0.9.0`!
goup

显示环境变量配置信息

输出当前 goup 所依赖或设置的关键环境变量及其说明。

$ goup env
+------------------------+--------------------------------+--------------------------------------------------------------+
| Key                    | Value                          | Explain                                                      |
+------------------------+--------------------------------+--------------------------------------------------------------+
环境变量名称 默认值 说明
GOUP_HOME /home/thinkgo/.goup goup 主目录路径,默认为 '$HOME/.goup'
GOUP_GO_VERSION current 当前 shell 会话的目标 Go 版本,默认为 'current'
GOUP_GO_REGISTRY_INDEX https://golang.google.cn Go 版本的索引镜像地址
GOUP_GO_REGISTRY https://dl.google.com/go Go 归档文件的下载仓库地址
GOUP_GO_SOURCE_GIT_URL https://github.com/golang/go 用于获取 tip 或 nightly 版本的源码 Git 地址,也可作为版本索引
GOUP_GO_SOURCE_GIT_URL https://go.googlesource.com/go tip 或 nightly 版本的上游 Git 源地址

Shell 补全功能

可通过命令为指定的 Shell 生成自动补全脚本。

goup completion <SHELL>
<SHELL>
bash
elvish
fish
powershell
zsh

支持的 Shell 类型包括:

执行以下命令可生成 zsh 补全脚本:

goup completion zsh > _goup

镜像站配置

可根据网络环境选择合适的镜像站点以提升下载速度和稳定性。

索引镜像站列表

来源 地址 使用方式 备注
官方1(默认) https://go.dev
--registry-index
official
官方2 https://golang.google.cn
official|https://go.dev
官方git 1 https://github.com/golang/go
official|https://golang.google.cn
git
通过 git 同步源码
官方git 2 https://go.googlesource.com/go
git|https://github.com/golang/go
通过 git 同步源码
阿里云 https://mirrors.aliyun.com/golang
git|https://go.googlesource.com/go
南京大学 https://mirrors.nju.edu.cn/golang
ngx-fancy-index|https://mirrors.aliyun.com/golang
华中科技大学 https://mirrors.hust.edu.cn/golang
ngx-fancy-index|https://mirrors.nju.edu.cn/golang

仓库镜像站列表

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

注意:部分镜像站未提供 SHA256 校验文件,在使用时需添加如下选项:

ngx-fancy-index|https://mirrors.hust.edu.cn/golang
--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

工作原理说明

该工具通过读取环境变量配置,结合指定的镜像源来管理 Go 的不同版本。根据用户指令从对应仓库下载、校验并安装所需的 Go 版本。

goup completion <SHELL>

同样地,可通过以下命令为当前 shell 生成补全脚本以提升操作效率。

goup [help]

获取更多帮助信息

运行以下命令查看详细文档和支持选项:

goup -h

显示此信息或指定子命令的帮助文档。

下载选定的 Go 版本至

$HOME/.goup/go<VERSION|tip>/go

并创建一个符号链接指向

$HOME/.goup/current
goup default/use/set [VERSION]

设定默认使用的 Go 版本。

goup ls/list/show

列出所有已安装的 Go 版本位置。

$HOME/.goup
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 版本?

从 goup-rs v0.15.x 开始,支持在单个

shell

会话中切换指定的 Go 版本。若使用的是

goup shell

*nix

系统上,请先执行

goup init

这是因为旧版的

env

文件未包含

GOUP_GO_VERSION

环境变量定义。而在

Windows

系统中,仅支持

powershell

如果系统中

COMSPEC

已关联到 PowerShell,则通常无需额外操作。详见 issue #360。

调试方法

默认日志级别为

Info

可通过使用

goup -v <subcommand>

goup -vv <subcommand>

来启用

Debug

Trace

级别的日志输出。

常见问题解答(FAQ)

编译和安装源码失败?
所需最低 Go 版本取决于目标 Go 的版本,具体要求请参考

semver

中的说明。

Go 版本 ≤ 1.20.x 解压失败?
该问题已在 v0.10.3 以上版本中修复。更多详情请查看 issue #251。

如何自定义

GOUP_HOME

(适用于 ≥ v0.11.x)?
默认使用

$HOME/.goup

目录作为

GOUP_HOME

如需自定义路径(尤其适用于 Windows 用户),可在安装

goup

前设置

GOUP_HOME

环境变量,并确保目标目录具备正确权限,否则可能导致异常行为。详见 issue #265 和 #270。

某些版本缺少 sha256 校验文件,如何安装?
从 goup-rs ≥ 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

但这只能获取最新的不稳定版本。为此,goup-rs(≥ v0.12.x)引入了

--use-raw-version

选项,允许用户安装任何已知确切版本。详见 issue #299 和 #307。

版本更新策略说明

  • 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

    版本。

goup install/update/i [TOOLCHAIN]

goup

$HOME/.goup/env

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群