抛弃 N 多个版本管理器后,我用 mise 一个搞定 Node/Python/Go/Rust
抛弃 N 多个版本管理器后,我用 mise 一个搞定 Node/Python/Go/Rust
你有没有过这种经历:
- 写 Node 项目要
nvm use 20,写 Python 项目要pyenv shell 3.11,写 Go 项目要手动改PATH - 每个项目根目录塞着
.nvmrc、.python-version、.tool-versions、.env、一坨 Makefile - 同事 clone 你的项目,第一件事就是” 我先装 nvm,再装 pyenv,再装 asdf……”
- 每次换电脑 / 起新机器,环境配置要重做一遍
mise(法语” 备料” 的意思)就是来解决这个问题的。它是 jdx/mise 维护的 Rust 写的多合一开发环境管理工具,一个 mise.toml 搞定所有事:
- ✅ 装任意版本的 Node、Python、Ruby、Go、Rust、Java、Terraform、jq、ripgrep……(900+ 工具)
- ✅ 按目录自动切换版本(cd 到项目里自动用对的版本)
- ✅ 管理环境变量(取代 direnv)
- ✅ 任务运行器(取代 make /npm scripts 链)
- ✅ 兼容 asdf(
.tool-versions直接能读)
2026 年的今天,我真心觉得:如果你只能装一个版本管理工具,装 mise。
一、什么是 mise
1.1 它解决了什么问题
传统多语言开发者的桌面环境长这样:
1 | ~/ |
所有这些工具的核心任务都是同一件事:” 在我进这个目录的时候,把对的工具版本和对的环境变量塞给我”。
mise 就是把这件事用一个工具做完。
1.2 mise 的核心定位
用官网的话说,它是一个 polyglot tool version manager—— 一个支持多语言的版本管理器,外加环境变量和任务管理。三个能力合一:
| 能力 | 替代谁 |
|---|---|
| Dev Tools | nvm + pyenv + rbenv + nodenv + sdkman + asdf |
| Environments | direnv + dotenv + envchain |
| Tasks | make + npm scripts + just + task |
1.3 谁在用
- GitHub 6,800+ commits / 568 个 release,主仓库 jdx/mise
- 活跃度极高(2026 年每月都有 release)
- 用 Rust 写(性能、单一二进制),TypeScript/Node 写周边
- CI 用 Namespace 赞助
- 项目作者 @jdx(同一个人维护的 rtx /aqua/aube 等工具)
二、安装 mise
官方一句话安装(macOS / Linux 通用):
1 curl https://mise.run | sh默认装到
~/.local/bin/mise,不需要手动加 PATH——mise 启动时会自己处理。
2.1 安装后验证
1 | $ mise --version |
2.2 接入 shell(必须做一次)
为了能 cd 项目时自动激活对应版本,shell 需要加载 mise:
1 | # Bash |
新开一个 shell,跑:
1 | $ mise doctor |
三、装第一个工具:5 分钟上手
3.1 装 Node
1 | # 装一个全局版本(写进 ~/.config/mise/config.toml) |
3.2 装多个工具
1 | $ mise use --global node@24 python@3.13 go@1.23 terraform@1 |
打开 ~/.config/mise/config.toml,你会看到:
1 | [tools] |
3.3 装个特定版本 /latest/system
1 | mise use --global node@22 # 具体版本 |
四、项目级配置:核心玩法
4.1 进项目自动切版本
在项目根目录建一个 mise.toml:
1 | [tools] |
然后 cd 进这个目录:
1 | $ cd my-project |
同事 clone 这个项目,只要装好 mise,进目录就自动安装并切换到正确版本。零配置。
4.2 mise install 一次性安装
1 | $ mise install |
或者只装特定工具:
1 | mise install node@22 |
4.3 配置文件优先级(覆盖关系)
1 | ~/.config/mise/config.toml ← 全局默认 |
更深的目录会覆盖更浅的。这意味着你可以在公司项目用 Java 8,在个人项目用 Java 21,完全互不干扰。
五、环境变量管理:替代 direnv
5.1 基本用法
mise.toml 加 [env] 段:
1 | [env] |
激活后:
1 | $ echo $NODE_ENV |
5.2 加载 .env 文件
1 | [env] |
也可以按需加载多个:
1 | [env] |
5.3 必备变量检查
1 | [env] |
如果 DATABASE_URL 没设,进入目录会直接报错 —— 避免上游服务连不上才发现自己忘了配环境变量。
5.4 敏感信息脱敏
1 | [env] |
跑 mise run 时这些值会被自动 mask——CI 日志里不会泄露 secret。
5.5 模板变量(懒求值)
1 | [env] |
等等 —— 为什么 tools = true?
因为默认情况下 env vars 在 tools 之前求值。tools = true 让 env 在 tools 之后才能拿到 tools.node.version。需要引用” 工具刚装好的状态” 时用。
六、任务运行器:替代 make
6.1 在 mise.toml 里写任务
1 | [tasks] |
跑:
1 | $ mise run test |
6.2 任务依赖
1 | [tasks] |
mise run ci 会按顺序跑完所有 4 个任务,任一失败即停。
6.3 任务里能用的环境变量
| 变量 | 含义 |
|---|---|
MISE_ORIGINAL_CWD |
启动 mise 时的目录 |
MISE_CONFIG_ROOT |
最近的 mise.toml 所在目录 |
MISE_PROJECT_ROOT |
项目根 |
MISE_TASK_NAME |
当前任务名 |
MISE_TASK_DIR |
任务定义文件所在目录 |
MISE_TASK_FILE |
任务定义文件路径 |
6.4 文件任务(更复杂的脚本)
如果任务比较复杂,可以放成 shell 脚本,文件名就是任务名:
1 | my-project/ |
mise-tasks/deploy:
1 |
|
跑 mise run deploy 跟之前一样。
6.5 任务参数
1 | [tasks.greet] |
1 | $ mise run greet |
七、900+ 工具的安装
mise 真正牛的地方:不是只能装语言运行时。它能装 CLI 工具。
7.1 工具来源(backends)
| Backend | 装什么 | 例子 |
|---|---|---|
core |
内置工具(最快的路径) | node python go ruby rust terraform kubectl jq ripgrep |
npm |
npm 上的包 | npm:@anthropic-ai/claude-code npm:typescript |
pipx |
PyPI 上的 Python CLI | pipx:black pipx:ruff |
github |
GitHub release 直接下 | github:BurntSushi/ripgrep |
aqua |
aqua-registry 里的工具 | aqua:cli/cli (即 gh) |
cargo |
crates.io | cargo:eza |
http |
任意 URL + checksum | 自定义二进制 |
7.2 实操:装几个常用 CLI
1 | # ripgrep(替代 grep) |
省得用 brew、pipx、npm、cargo 四个地方分别装了 —— 一个 mise use --global 全搞定。
7.3 平台 / 系统限制
1 | [tools] |
只在 macOS / Linux 装,Windows 不装。
7.4 装好之后跑命令
1 | # 不激活 shell,直接用 |
八、mise.toml 完整示例
一个真实项目的 mise.toml 长这样:
1 | # 工具版本 |
这一个文件能替代:.nvmrc + .python-version + .env + Makefile + direnv。
九、对比:mise vs asdf vs 各语言原生工具
很多人会问:” 我已经用了 nvm/pyenv/sdkman,干嘛换?”
9.1 功能对比
| 能力 | nvm | pyenv | sdkman | asdf | mise |
|---|---|---|---|---|---|
| Node 多版本 | ✅ | ❌ | ❌ | ✅ | ✅ |
| Python 多版本 | ❌ | ✅ | ❌ | ✅ | ✅ |
| Java/Maven/Gradle | ❌ | ❌ | ✅ | ✅ | ✅ |
| Go/Rust 多版本 | ❌ | ❌ | ❌ | ✅ | ✅ |
| Terraform/kubectl 等 100+ 工具 | ❌ | ❌ | ❌ | ✅ | ✅ |
| 环境变量管理 | ❌ | ❌ | ❌ | ❌ | ✅ |
| 任务运行器 | ❌ | ❌ | ❌ | ❌ | ✅ |
| 装任意 npm/pipx/cargo crate | ❌ | ❌ | ❌ | ❌ | ✅ |
兼容 .tool-versions |
❌ | ❌ | ❌ | ✅ | ✅ |
| 单文件统一配置 | ❌ | ❌ | ❌ | ❌ | ✅ |
| 安装速度 | 慢 | 慢 | 慢 | 慢(要装 shims) | 快(Rust + 真路径) |
| 插件信任模型 | 自家 | 自家 | 官方 | 社区插件 | 官方 + 强信任提示 |
9.2 性能对比(2025 年实测)
asdf 用了 5+ 个插件后,启动一个 shell 要 800ms-2s(每个插件一个 shim)。mise 启动只要 30-50ms—— 因为它不用 shim,直接改 PATH 指到真二进制。
9.3 安全性对比
asdf 最大的问题是 插件来自社区 —— 你信任 asdf 工具作者,还得信任写 asdf 插件的第三方开发者。这些人写的脚本能跑任意代码。
mise 的策略:
- 核心工具用官方 backend(直接下 binary)
- npm/pipx/cargo 走包管理器自己的供应链
- 装别人的
mise.toml时会弹” 是否信任” 提示 —— 不会偷偷执行
9.4 迁移成本
从 asdf 迁过来零成本 ——mise 读 .tool-versions。装好 mise,旧的 asdf 项目不用改任何文件。
从 nvm/pyenv 迁过来:要把 ~/.nvmrc / ~/.python-version 改成 mise.toml 的 [tools] 段,或者用 mise use 命令自动生成。
十、实际工作流:mise 的一天
10.1 早上新开项目
1 | $ git clone git@github.com:acme/webapp.git |
没有” 先装 nvm、再装 Node、再装依赖” 这一长串。
10.2 切到另一个项目
1 | $ cd ~/work/old-rails-app |
完全不同的版本组合,cd 之间无缝切换。
10.3 部署到 CI
mise 有官方 mise-action 给 GitHub Actions 用:
1 | # .github/workflows/ci.yml |
CI 跟本地用的是完全一样的环境 ——mise.toml 是 source of truth。
十一、避坑指南
11.1 装了 mise 但没生效
症状:node --version 还是系统版本。
原因:shell 启动时没加载 mise activate。
修法:
1 | # 确认 ~/.zshrc 或 ~/.bashrc 有这行 |
11.2 装工具慢
症状:mise install 卡半天。
原因:默认从 GitHub / NodeSource 下载,国内可能慢。
修法:
1 | # mise.toml |
11.3 信任提示太烦
症状:clone 别人的项目,弹” 是否信任 mise.toml”。
原因:安全设计 —— 别人的配置可能跑任意代码。
取舍:
- 团队内:
mise trust一次性信任 - CI:环境变量
MISE_TRUSTED_CONFIG_PATHS=/ - 个人:看情况
11.4 zsh 下跟其它 PATH 改动冲突
如果你之前用了 SDKMAN、jenv、asdf,别同时加载 —— 它们会互相抢 PATH。
推荐:迁移到一个就够了。mise + sdkman 也能配合(mise 管 Node/Python,sdkman 管 Java),但 PATH 顺序要自己控制。
11.5 Windows 上呢?
能用,但需要 WSL。纯 Windows 支持有限(PowerShell 激活有部分功能缺失)。如果你主力 Windows,建议 WSL 2。
十二、结语
写到这里,我突然意识到 ——mise 真正解决的问题不是” 装工具”,而是” 让一个项目的 setup 跟着仓库走 “。
过去 10 年我们学会了” 代码跟仓库走”(git),” 配置跟代码走”(CI/CD),” 基础设施跟代码走”(IaC)。但” 开发环境” 还是跟着人走 —— 每个开发者自己装、自己配、自己维护、版本漂移、新人 onboarding 痛苦。
mise.toml 把” 开发环境” 也变成代码。一个文件 + 几条命令,新人 5 分钟到位,CI 跟本地一致,老项目维护不再” 在我电脑能跑”。
如果你 2026 年还在装 nvm + pyenv + sdkman + asdf + direnv + make 六个工具 —— 试试 mise,可能直接省掉 4 个。
相关链接:
- 官网:https://mise.jdx.dev/
- GitHub:https://github.com/jdx/mise
- 工具清单:https://mise.jdx.dev/registry.html
- vs asdf 对比:https://mise.jdx.dev/dev-tools/comparison-to-asdf.html
- GitHub Action:https://github.com/jdx/mise-action
- 作者新项目 aube(Node 包管理器):https://aube.en.dev