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 把这些收拢成一个工具一个文件:

传统方案

mise 的对应做法

nvm + .nvmrc(还得手动 nvm use

mise use node@24,进目录自动生效

pyenv + pyenv-virtualenv

mise use python@3.13

rbenv / sdkman / 手动下载

同一个 mise use,registry 里 1000+ 工具

direnv + .envrc + shell hook

mise.toml 里的 [env]

npm scripts / Makefile / README 片段

mise.toml 里的 [tasks]

它不是"又一个版本管理器",而是把版本、环境、命令三件事合并到了一份声明式配置里。这也是它在 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"

三个段落,对应三件事:

段落

作用

关键命令

[tools]

声明工具及版本,进目录自动切换

mise use / mise install

[env]

声明环境变量,进出目录自动加载/还原

mise env / mise set

[tasks]

声明项目命令,自带工具与环境

mise run / mise tasks ls

配好之后,把它提交进仓库。别人克隆下来只需要一条 mise install


四、速查表

工具

命令

说明

mise use node@24

安装并写入项目配置

mise use --global node@24

装成个人全局默认

mise install

安装配置里已声明的工具

mise ls

已安装的工具

mise ls --current

当前目录实际生效的版本

mise ls-remote node

查看可安装版本

mise outdated / mise upgrade

检查更新 / 升级

mise exec -- <cmd>

用项目环境执行一条命令

环境

命令

说明

mise env

导出当前生效的环境变量

mise set KEY=value

写入 mise.toml[env]

mise unset KEY

移除

mise config ls

看哪些配置文件在生效、优先级如何

任务

命令

说明

mise run <task>

跑任务(默认先补齐缺失工具)

mise tasks ls

列出所有任务

mise tasks info <task>

查看单个任务详情

mise tasks add hello -- echo hi

命令行直接加任务

其他

命令

说明

mise doctor

环境自检

mise trust

显式信任一份配置

mise completion zsh --install

装命令补全

mise bootstrap

按声明装机器(包 / dotfiles / 服务)


五、五个真实场景

场景 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 execmise 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 模式要求显式信任。


八、常见坑

现象

原因 / 解法

装好了但直接敲 node 还是老版本

没激活 shell,或改了 rc 没重启终端。先跑 mise doctor

mise exec 能跑,直接敲不行

同上,激活问题

报 GitHub API rate limit

配一个 GitHub token(见官方 github-tokens 文档)

团队里两人版本还是不一样

"24" 是系列不是精确版本,提交 mise.lock

IDE 里版本和终端不一致

编辑器没走 shell 配置,用 shims

Windows 上命令找不到

没激活 PowerShell,或没把 shims 目录加进 PATH


九、上手路径

  1. 第一天:装上 + 激活,用 mise use --global node@24 先替掉 nvm 的日常用途;

  2. 第二天:在一个真实项目里建 mise.toml,只写 [tools],提交进仓库;

  3. 第一周:把 .env 搬进 [env],体验进出目录变量自动切换;

  4. 第二周:把 README 里那串"先跑这个再跑那个"收进 [tasks]

  5. 再往后: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 和官方文档为准。