碎片化的版本管理之痛
如果你同时维护多个项目,大概率经历过这种场景:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
$ python --version
Python 3.9.7
$ cd ~/project-b
$ python --version
# 报错:需要 Python 3.11+
# 于是你装了 pyenv
$ pyenv install 3.11.4
$ pyenv local 3.11.4
# 然后又接到一个 Ruby 项目
$ rbenv install 3.2.2
$ rbenv local 3.2.2
# 前端同事说 Node 要用 18
$ nvm install 18
$ nvm use 18
|
三个语言,三个版本管理器,三套配置语法。 桌面图标摆满了,心智负担拉满了。
今天介绍的 mise(前身 rtx)只用一个工具就能管理所有语言的版本,配置统一,体验丝滑。
mise 是什么?
mise 是一个多语言版本管理器(polyglot version manager),目标是成为 nvm、pyenv、rbenv、goenv、jenv、volta 等工具的统一替代品。
核心特点:
- 一个工具管所有:Node、Python、Ruby、Go、Java、Rust、PHP 等 40+ 语言
- 兼容已有生态:可以调用 nvm、pyenv、rbenv 等已有插件
- 配置即代码:
.mise.toml 文件随项目走,团队共享同一版本
- 全局 + 项目级:类似
.nvmrc,但更强大
- 性能极快:Go 编写,毫秒级切换
安装 mise
macOS(Homebrew):
Linux/macOS(通用安装脚本):
1
|
curl https://mise.run | sh
|
安装后激活(添加到 shell 配置):
1
2
3
4
5
6
7
8
|
# bash 用户
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
# zsh 用户
echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc
# fish 用户
echo '~/.local/bin/mise activate fish | source' >> ~/.config/fish/config.fish
|
重启终端后,输入 mise --version 验证安装。
基础用法:5 分钟上手
安装语言运行时
切换版本
执行 mise use 后,会在当前目录生成 .mise.toml 文件:
1
2
3
|
[tools]
python = "3.12"
node = "20"
|
把这个文件提交到 Git 仓库,团队成员执行 mise install 即可自动安装完全一致的版本。
查看当前版本
1
2
3
4
5
6
7
8
|
# 查看所有已激活的版本
mise current
# 查看某个语言的已安装版本
mise list python
# 查看某个语言的所有可用版本
mise ls-remote python
|
.mise.toml 配置详解
.mise.toml 是 mise 的核心配置文件,支持项目级和全局级(~/.config/mise/config.toml)。
完整示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
# 项目级配置
[tools]
python = "3.12" # 精确版本
node = "20" # 最新的 20.x
ruby = "3.3" # 最新的 3.3.x
go = "1.22" # 精确版本
java = "temurin-21" # 指定发行版
rust = "latest" # 最新稳定版
# 环境变量(只在该项目生效)
[env]
DATABASE_URL = "postgresql://localhost:5432/mydb"
PYTHONPATH = "./src"
LOG_LEVEL = "debug"
# 别名:给版本号起个好记的名字
[alias]
py3 = "[email protected]"
py2 = "[email protected]"
# PATH 操作
[env]
_.path = [
"./node_modules/.bin", # 把项目的 node_modules/.bin 加入 PATH
"./scripts"
]
|
语法版本号规则
mise 支持灵活的版本号语法:
实战:多语言项目的工作流
假设你有一个全栈项目:后端 Python,前端 Node,还有个 Go 写的 CLI 工具。
第一步:初始化配置
生成的 .mise.toml:
1
2
3
4
|
[tools]
python = "3.12"
node = "20"
go = "1.22"
|
第二步:提交配置
1
2
|
git add .mise.toml
git commit -m "chore: pin tool versions with mise"
|
第三步:新同事克隆项目后
1
2
3
4
5
6
7
8
9
10
|
git clone https://github.com/xxx/my-fullstack-project.git
cd my-fullstack-project
# 自动安装所有指定版本
mise install
# 验证
python --version # Python 3.12.x
node --version # v20.x.x
go version # go1.22.x
|
一条 mise install,三种语言版本全部就绪。 不需要再教新人装 nvm、配 pyenv、折腾 rbenv 了。
进阶技巧
自动切换(auto activate)
在项目目录下执行 mise use 后,每次 cd 进入该目录,mise 会自动切换版本,离开时自动恢复。
1
2
|
# 启用自动切换(默认已开启,确认配置)
mise settings autoActivate on
|
整合 Dockerfile
在 Docker 多阶段构建中使用 mise:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
FROM ubuntu:22.04
# 安装 mise
RUN curl https://mise.run | sh
ENV PATH="/root/.local/bin:$PATH"
# 复制配置并安装
COPY .mise.toml .
RUN mise install
# 激活版本
RUN eval "$(mise activate bash)"
# 现在可以直接用 node、python 等命令
RUN node --version && python --version
|
用 mise 替代 nvm/pyenv 的已有配置
如果你已经在用 nvm 或 pyenv,mise 可以无缝接管:
1
2
3
4
5
6
7
8
9
10
|
# mise 可以调用已有的 nvm 安装的 Node 版本
# 不需要重新下载,直接复用
# 如果想完全迁移到 mise,先卸载旧工具
# nvm 用户
export NVM_DIR=""
unset NVM_DIR
# pyenv 用户
# 注释掉 ~/.bashrc 中的 pyenv init 相关行
|
Shims 模式
mise 默认通过修改 PATH 来切换版本。如果你更喜欢 shim 模式(类似 rbenv):
1
2
3
4
5
|
# 启用 shims 模式
mise settings shims_dir ~/.local/share/mise/shims
# 生成所有已安装工具的 shim
mise reshim
|
与 CI/CD 集成
GitHub Actions 示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install mise
uses: jdx/mise-action@v2
with:
install: true # 自动读取 .mise.toml 并安装
- name: Build
run: |
python --version
node --version
make build
|
mise vs 其他工具
| 特性 |
mise |
nvm |
pyenv |
volta |
| 多语言支持 |
✅ 40+ |
❌ 仅 Node |
❌ 仅 Python |
❌ 仅 Node |
| 配置文件 |
.mise.toml |
.nvmrc |
.python-version |
package.json |
| 安装速度 |
极快(Go) |
慢(Shell) |
中等 |
快(Rust) |
| 兼容已有工具 |
✅ |
❌ |
❌ |
❌ |
| 自动切换 |
✅ |
需插件 |
需插件 |
✅ |
| 全局+项目级 |
✅ |
✅ |
✅ |
❌ |
写在最后
mise 不是什么革命性的发明,它只是把"用不同工具管理不同语言版本"这件事统一了。但正是这种减少摩擦的小改进,日积月累下来,对开发体验的提升是巨大的。
如果你的项目涉及两种以上语言,或者你受够了终端里装满 nvm/pyenv/rbenv,试试 mise。一条 curl https://mise.run | sh 的投入,换来的是整洁的开发环境和不再需要解释的团队配置。
1
2
3
|
# 最后,检查你的 mise 版本
mise --version
# 应该输出类似:mise 2026.x.x
|
小提示:mise 的前身叫 rtx,2023 年底更名。如果你搜索时看到 rtx 相关的内容,它们实际上指向的是同一个工具。