前言
你是不是也遇到过这些场景:
- 公司老项目还在用 Go 1.21,新项目已经上了 1.25
- 本地装了好几个 Go,每次都要改 PATH 或者用一堆别名
- 换台电脑或者新同事入职,环境配置半天
go install装的工具,升级 Go 后又要重新装一遍
这些问题,用mise都能优雅解决。
一、mise 是什么?为什么特别适合 Go?
mise(全称 mise-en-place)是一个现代化的开发工具版本管理器,可以同时管理 Node、Python、Go、Rust、Terraform 等几十种工具。
它和 asdf、nvm、gvm 最大的区别在于:
- 配置简单:一份
mise.toml就能声明项目需要的所有工具 - 自动切换:进入项目目录,版本自动生效
- 功能全面:版本管理 + 环境变量 + 任务运行,一个工具搞定
- 对 Go 原生支持很好:直接读取
go.mod/go.work里的 toolchain
简单说:它让“多版本 Go 共存”这件事变得像呼吸一样自然。
g:Go 版本管理器安装与使用指南GVM:Go 版本管理器安装与使用指南
二、安装与激活(只需一次)
# 安装 curl https://mise.run | sh # 激活(以 zsh 为例,bash/fish 类似) echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc source ~/.zshrc验证一下:
mise --version三、核心用法:多项目不同 Go 版本
假设你有三个项目:
| 项目 | 需要的 Go 版本 |
|---|---|
| legacy-api | 1.21 |
| current-service | 1.24 |
| new-feature | 1.25 |
1. 为每个项目指定版本
# 老项目 cd ~/code/legacy-api mise use go@1.21 # 当前项目 cd ~/code/current-service mise use go@1.24 # 新项目 cd ~/code/new-feature mise use go@1.25每个项目目录下都会自动生成mise.toml:
# legacy-api/mise.toml [tools] go = "1.21" # current-service/mise.toml [tools] go = "1.24"2. 自动切换,无需手动操作
只要你激活了 mise,进入不同目录就会自动切换:
cd ~/code/legacy-api go version # go version go1.21.x ... cd ~/code/new-feature go version # go version go1.25.x ...是不是比以前清爽多了?
3. 常用检查命令
mise ls --current # 查看当前生效的工具版本 mise which go # 查看实际使用的 go 路径 mise config ls # 查看当前生效的配置文件四、实战示例:完整工作流
我们来模拟一个真实场景。
场景:新接手一个项目,需要 Go 1.24,同时还要用到 lazygit 和 dlv。
# 1. 进入项目 cd ~/code/my-go-project # 2. 指定 Go 版本 mise use go@1.24 # 3. 安装常用 Go 工具(推荐用 go: 后端,而不是直接 go install) mise use go:github.com/jesseduffield/lazygit@latest mise use go:github.com/go-delve/delve/cmd/dlv@latest # 4. 查看结果 cat mise.toml此时mise.toml大概是这样:
[tools] go = "1.24" "go:github.com/jesseduffield/lazygit" = "latest" "go:github.com/go-delve/delve/cmd/dlv" = "latest"然后把这个文件提交到 Git。团队其他成员只需要:
git clone <项目地址> cd my-go-project mise install # 自动安装所有声明的工具 go version # 直接就能用正确版本五、进阶小技巧
1. 让 mise 自动读取 go.mod / go.work
mise settings add idiomatic_version_file_enable_tools go开启后,如果go.mod或go.work里写了:
toolchain go1.24.3mise 就会优先使用这个版本,连mise.toml都可以不写。
2. 全局默认版本 + 项目覆盖
# 设置一个全局默认版本 mise use -g go@1.25 # 某个老项目单独覆盖 cd ~/code/old-project mise use go@1.21优先级是:项目配置 > 全局配置。
3. 不想激活 shell 也能用
mise exec -- go version # 使用当前项目版本 mise exec go@1.24 -- go test ./... # 临时指定版本运行4. 升级版本也很方便
# 在当前大版本内升级(1.24.x → 最新的 1.24) mise upgrade go # 升级到更新的大版本,并修改 mise.toml mise upgrade --bump go六、总结:为什么推荐用 mise 管理 Go?
| 痛点 | mise 的解决方案 |
|---|---|
| 多版本切换麻烦 | 进入目录自动切换 |
| 环境难复现 | 一份mise.toml提交到 Git 即可 |
| 工具依赖 Go 版本 | 用go:后端统一管理 |
| 新同事入职配置繁琐 | mise install一条命令搞定 |
| 全局和项目版本冲突 | 全局默认 + 项目覆盖,清晰明了 |
mise 把「版本管理」从一件需要小心翼翼维护的事情,变成了声明式、可复现、几乎无感知的日常操作。
如果你正在同时维护多个 Go 项目,强烈建议花半小时试试。用过之后,大概就不想再回到以前手动管理版本的日子了。
参考链接
- 官方文档:https://mise.jdx.dev
- Go 专题页:https://mise.jdx.dev/lang/go.html
- GitHub:https://github.com/jdx/mise