Contents

mise:一个工具取代nvm、pyenv、rbenv——多语言开发环境管理的终极方案

碎片化的版本管理之痛

如果你同时维护多个项目,大概率经历过这种场景:

 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):

1
brew install mise

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 分钟上手

安装语言运行时

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 安装 Python 3.12
mise install [email protected]

# 安装 Node 20 LTS
mise install node@20

# 安装 Ruby 3.3
mise install [email protected]

# 一次安装多个
mise install [email protected] node@20 [email protected]

切换版本

1
2
3
4
5
# 全局切换(影响所有终端会话)
mise use --global [email protected]

# 项目级切换(只在当前目录生效)
mise use [email protected]

执行 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 支持灵活的版本号语法:

1
2
3
4
5
mise install [email protected]    # 精确到 patch
mise install [email protected]      # 最新的 3.12.x
mise install python@3         # 最新的 3.x
mise install python@latest    # 最新稳定版
mise install [email protected]:latest  # >=3.12.4 的最新版

实战:多语言项目的工作流

假设你有一个全栈项目:后端 Python,前端 Node,还有个 Go 写的 CLI 工具。

第一步:初始化配置

1
2
cd ~/my-fullstack-project
mise use [email protected] node@20 [email protected]

生成的 .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 相关的内容,它们实际上指向的是同一个工具。