mise:用一个二进制替掉 nvm + pyenv + rbenv + direnv
mise(读作 "meez",取自法语 mise en place「各归其位」)是这两年冒头最快的基础设施类工具。它是一个 Rust 写的单文件二进制,同时管三件事:开发工具的版本、项目的环境变量、日常命令。配置全写在一个
mise.toml里,你、同事、CI 用同一份。
前面写过 lazygit(把 Git 操作变成按键),这篇是它的天然搭档:lazygit 管代码历史,mise 管代码跑起来之前的那堆环境。
一、为什么是它
先看看你的机器上是不是也这样:
Node 用 nvm,Python 用 pyenv,Ruby 用 rbenv,Java 用 sdkman,Terraform 手动下载 —— 四个工具、四套命令、四种配置格式;
从 A 项目切到 B 项目忘了切 Node 版本,跑起来才报一莫名其妙的错;
项目环境变量靠
.env+ 手动source,讲究点的再装一个 direnv;启动命令散落在
package.json的 scripts、Makefile、以及 README 里那句"先执行这个再执行那个"。
mise 把这些收拢成一个工具一个文件:
它不是"又一个版本管理器",而是把版本、环境、命令三件事合并到了一份声明式配置里。这也是它在 2025–2026 年的各种开发者工具榜里频繁出现的原因——省的不是一条命令,是一整类心智负担。
补充背景:mise 前身叫 rtx,2024 年改名为 mise。如果你以前用过 rtx,配置思路基本一致。
二、安装(两分钟)
macOS / Linux
# 官方推荐,装到 ~/.local/bin/mise
curl https://mise.run | sh
# 想一步到位(自动把激活语句写进 rc 文件),用对应 shell 的地址
curl -fsSL https://mise.run/zsh | sh
curl -fsSL https://mise.run/bash | sh
curl -fsSL https://mise.run/fish | sh
其他方式:
brew install mise # 官方不首选,更新和二进制表现不如 mise.run
cargo install --locked mise # 有 Rust 工具链
npm install -g mise # 分发的是预编译二进制,不是 Node 包
Debian / Ubuntu:
sudo apt install -y extrepo
sudo extrepo enable mise
sudo apt update && sudo apt install -y mise
Fedora / RHEL / CentOS:
sudo dnf copr enable jdxcode/mise
sudo dnf install mise
Windows
scoop install mise
winget install jdx.mise
choco install mise # 版本可能滞后
激活 shell(可选但强烈建议)
# 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
PowerShell(需要 7+):
Add-Content $PROFILE '(&mise activate pwsh) | Out-String | Invoke-Expression'
Windows 上不方便激活的话,退而求其次把 shims 目录加进 PATH:%LOCALAPPDATA%\mise\shims。
最后验证:
mise --version
mise doctor # 检查安装和 shell 配置是否正确
不激活也能用:
mise exec -- <命令>和mise run <任务>都会自动加载项目环境。CI、脚本、临时执行用这两个就够了。
三、一个 mise.toml 看懂全部
项目根目录下放一个 mise.toml(也可以用 .mise.toml,隐藏文件风格):
[tools]
node = "24"
python = "3.13"
terraform = "1.13"
[env]
NODE_ENV = "development"
_.file = ".env" # 直接加载 .env(也支持 .env.json / yaml)
_.path = "{{config_root}}/node_modules/.bin"
[tasks.dev]
description = "启动开发服务"
run = "npm run dev"
[tasks.check]
description = "提交前自检"
depends = ["format", "test"] # 两个前置任务会并行跑
[tasks.format]
run = "npm run format:check"
[tasks.test]
run = "npm test"
三个段落,对应三件事:
配好之后,把它提交进仓库。别人克隆下来只需要一条 mise install。
四、速查表
工具
环境
任务
其他
五、五个真实场景
场景 1:新人第一天,一条命令配好环境
以前:README 里写"装 Node 22、Python 3.12、记得 nvm use、再 copy 一份 .env.example"。
现在:
git clone <repo> && cd <repo>
mise install # 按 mise.toml 装齐所有工具
mise run setup # 跑项目自定义的初始化任务
如果团队要求版本完全一致(而不是"22.x 系列最新版"),把 mise.lock 一起提交,所有人解析到的版本就一模一样。注意 node = "24" 这种写法选的是 24 系列的某个发布版,不是精确锁定。
场景 2:多项目来回切,不再手动 nvm use
同时在维护三个项目:老项目 Node 22、新项目 Node 24、另一个用 Bun。
激活过一次之后,cd 就是全部操作——进目录时 mise 把对应版本的工具放到 PATH 前面,出目录时还原。忘记切版本导致的"在我机器上是好的"直接从根上消失。
可以用 mise ls --current 随时确认当前到底用的是哪个版本。
场景 3:环境变量不再靠手动 source
[env] 段比 .env 强的地方在于它是可编程的:
[env]
# 直接加载 dotenv / json / yaml
_.file = [
".env",
{ path = ".secrets.yaml", redact = true }
]
# 往 PATH 里加目录,支持模板变量
_.path = [
"~/.local/share/bin",
"{{config_root}}/node_modules/.bin"
]
# 模板与 shell 风格展开都能用
PROJECT_CACHE = "{{config_root}}/.cache"
LD_LIBRARY_PATH = "$PROJECT_CACHE:${LD_LIBRARY_PATH:-}"
# 只在没设置过时给默认值
NODE_ENV = { default = "development" }
离开目录变量自动消失,不会污染下一个项目的环境。
场景 4:把 README 里的命令收进 tasks
命令一长,脚本文件比 TOML 更舒服。建一个 mise-tasks/hello:
#!/usr/bin/env bash
#MISE description="检查任务运行是否正常"
echo "hello from a file task"
chmod +x mise-tasks/hello
mise run hello
好处是脚本能被 shellcheck 检查、能被编辑器高亮。任务之间用 depends 声明依赖(前置任务默认并行跑),需要严格串行就把 run 写成数组。
场景 5:CI / Docker 里复用同一份配置
CI 里不需要激活 shell,直接用 mise exec 或 mise run:
curl https://mise.run | sh
export PATH="$HOME/.local/bin:$PATH"
mise install # 或 mise run test,会自动先装工具
mise exec -- npm test
Dockerfile 里也一样,好处是本地和 CI 用的是同一个 mise.toml,不存在"CI 上版本不一样"这类问题。
六、从 asdf / nvm 迁过来
asdf 用户:
.tool-versions直接就能用,不用改。mise 支持 asdf 后端,asdf 的插件可以照常使用。nvm / pyenv 用户:mise 能识别
.nvmrc、.python-version这类"惯用版本文件",在配置里开启即可(见官方 configuration 文档的 idiomatic version files)。工具的来源:registry 里的工具走不同后端获取——aqua、GitHub Releases、cargo、npm、pipx、go、gem、asdf、vfox 等。registry 里没有的,可以显式指定后端:
mise exec github:BurntSushi/ripgrep -- rg --version
迁移建议:别一次性删掉 nvm/pyenv。先装 mise 跑一两个项目,确认无误再逐个卸。
七、几个值得马上做的小设置
(1)装命令补全(效果好到值得单独提)
mise completion zsh --install # 也支持 bash / fish / powershell
(2)给编辑器和 IDE 配 shims
VS Code、JetBrains 这类不会 source 你的 .zshrc,它们启动时拿不到 mise 管理的工具。把 shims 目录加进 PATH 或者配置编辑器的 Node/Python 路径指向 shims,能解决"IDE 里版本和终端里不一致"的老问题。
(3)把常用工具设成全局默认
mise use --global node@24 python@3.13 ripgrep@latest
项目里没单独声明时就用这份全局默认,省得每个临时目录都重装一遍。项目配置始终可以覆盖全局。
(4)注意 mise trust
mise.toml 里的 tasks、hooks 和部分 env 指令是可以执行代码的。跑别人的仓库前先看一眼配置,必要时用 paranoid 模式要求显式信任。
八、常见坑
九、上手路径
第一天:装上 + 激活,用
mise use --global node@24先替掉 nvm 的日常用途;第二天:在一个真实项目里建
mise.toml,只写[tools],提交进仓库;第一周:把
.env搬进[env],体验进出目录变量自动切换;第二周:把 README 里那串"先跑这个再跑那个"收进
[tasks];再往后:CI / Dockerfile 里统一用
mise install+mise run,本地和流水线彻底对齐。
一句话总结:如果你受够了"这台机器上到底装的是哪个版本",mise 是目前最省事的解法。
参考
官网:https://mise.jdx.dev/
安装:https://mise.jdx.dev/installing-mise.html
上手:https://mise.jdx.dev/getting-started.html
可用工具 registry:https://mise.jdx.dev/registry.html
环境变量:https://mise.jdx.dev/environments/
任务:https://mise.jdx.dev/tasks/
本文基于 2026 年 mise 官方文档编写。mise 迭代很快,命令细节以
mise --help和官方文档为准。