抛弃 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……”
  • 每次换电脑 / 起新机器,环境配置要重做一遍

6 工具 vs 1 文件

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
2
3
4
5
6
7
8
9
10
~/
├── .nvm/ # Node 版本
├── .pyenv/ # Python 版本
├── .rbenv/ # Ruby 版本
├── .cargo/ # Rust 工具链
├── .sdkman/ # Java + Maven
├── .asdf/ # 各种杂项(Terraform / kubectl / ...)
├── .envrc # direnv 配的 PATH
├── 各种 .zshrc 加载段
└── 每个项目 .tool-versions / .nvmrc / .python-version ...

所有这些工具的核心任务都是同一件事:” 在我进这个目录的时候,把对的工具版本和对的环境变量塞给我”。

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
2
$ mise --version
mise 2025.x.x

2.2 接入 shell(必须做一次)

为了能 cd 项目时自动激活对应版本,shell 需要加载 mise:

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

新开一个 shell,跑:

1
2
$ mise doctor
✓ mise is ready

三、装第一个工具:5 分钟上手

3.1 装 Node

1
2
3
4
5
6
7
8
# 装一个全局版本(写进 ~/.config/mise/config.toml)
$ mise use --global node@24

# 验证
$ node --version
v24.x.x
$ which node
/home/you/.local/share/mise/installs/node/24/bin/node

3.2 装多个工具

1
2
$ mise use --global node@24 python@3.13 go@1.23 terraform@1
✓ wrote ~/.config/mise/config.toml

打开 ~/.config/mise/config.toml,你会看到:

1
2
3
4
5
[tools]
node = "24"
python = "3.13"
go = "1.23"
terraform = "1"

3.3 装个特定版本 /latest/system

1
2
3
4
mise use --global node@22            # 具体版本
mise use --global node@latest # 最新稳定版
mise use --global node@lts # 最新 LTS
mise use --global node@system # 用系统已装的

四、项目级配置:核心玩法

4.1 进项目自动切版本

在项目根目录建一个 mise.toml

1
2
3
4
[tools]
node = "22.11.0" # 锁死小版本
python = "3.12"
go = "1.22"

然后 cd 进这个目录

1
2
3
4
5
$ cd my-project
$ node --version
v22.11.0 ← 不是全局的 24,是项目要求的 22.11.0
$ python --version
Python 3.12.x

同事 clone 这个项目,只要装好 mise,进目录就自动安装并切换到正确版本。零配置。

4.2 mise install 一次性安装

1
2
3
4
$ mise install
✓ node 22.11.0 installed
✓ python 3.12 installed
✓ go 1.22 installed

或者只装特定工具

1
2
mise install node@22
mise install python@3.12

4.3 配置文件优先级(覆盖关系)

1
2
3
4
~/.config/mise/config.toml         ← 全局默认
~/work/mise.toml ← 工作目录通用
~/work/myproj/mise.toml ← 项目级(最高优先级)
~/work/myproj/.tool-versions ← 兼容 asdf 旧格式(也能读)

更深的目录会覆盖更浅的。这意味着你可以在公司项目用 Java 8,在个人项目用 Java 21,完全互不干扰


五、环境变量管理:替代 direnv

5.1 基本用法

mise.toml[env] 段:

1
2
3
4
[env]
NODE_ENV = "production"
DATABASE_URL = "postgres://localhost/orders"
API_PORT = "8080"

激活后:

1
2
3
4
$ echo $NODE_ENV
production
$ echo $DATABASE_URL
postgres://localhost/orders

5.2 加载 .env 文件

1
2
[env]
_.file = ".env"

也可以按需加载多个

1
2
[env]
_.file = [".env", ".env.local"]

5.3 必备变量检查

1
2
3
[env]
DATABASE_URL = { required = "Set DATABASE_URL to your PostgreSQL connection string" }
STRIPE_API_KEY = { required = "Get your key from https://dashboard.stripe.com/apikeys" }

如果 DATABASE_URL 没设,进入目录会直接报错 —— 避免上游服务连不上才发现自己忘了配环境变量。

5.4 敏感信息脱敏

1
2
3
4
5
[env]
SECRET_KEY = { value = "my_secret", redact = true }

# 或者按模式批量
redactions = ["SECRET_*", "*_TOKEN", "PASSWORD"]

mise run 时这些值会被自动 mask——CI 日志里不会泄露 secret。

5.5 模板变量(懒求值)

1
2
3
[env]
NODE_VERSION = { value = "{{ tools.node.version }}", tools = true }
_.path = { path = ["{{ env.GEM_HOME }}/bin"], tools = true }

等等 —— 为什么 tools = true

因为默认情况下 env vars 在 tools 之前求值。tools = true 让 env 在 tools 之后才能拿到 tools.node.version。需要引用” 工具刚装好的状态” 时用。


六、任务运行器:替代 make

6.1 在 mise.toml 里写任务

1
2
3
4
5
[tasks]
build = "cargo build"
test = "cargo test"
lint = "cargo clippy -- -D warnings"
format = "cargo fmt"

跑:

1
2
3
4
5
6
$ mise run test
cargo test
Compiling myapp v0.1.0
Finished test [unoptimized + debuginfo] target(s)
Running unittests
test result: ok. 42 passed; 0 failed

6.2 任务依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
[tasks]
lint = "eslint ."
typecheck = "tsc --noEmit"
test = "vitest run"
e2e = "playwright test"

[tasks.ci]
run = [
"lint",
"typecheck",
"test",
"e2e",
]

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
2
3
4
my-project/
├── mise.toml
└── mise-tasks/
└── deploy

mise-tasks/deploy

1
2
3
4
5
6
7
#!/usr/bin/env bash
#MISE description="Build and deploy the CLI"
set -euo pipefail
echo "Building..."
cargo build --release
echo "Deploying to S3..."
aws s3 sync ./target/release/ s3://my-bucket/

mise run deploy 跟之前一样。

6.5 任务参数

1
2
[tasks.greet]
run = "echo hello {{arg(name='world')}}"
1
2
3
4
$ mise run greet
hello world
$ mise run greet --name Alice
hello Alice

七、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
2
3
4
5
6
7
8
9
10
11
# ripgrep(替代 grep)
mise use --global github:BurntSushi/ripgrep

# 最新的 jq
mise use --global jq@latest

# Python 的 ruff(linter)
mise use --global pipx:ruff

# 装个全局的 TypeScript
mise use --global npm:typescript

省得用 brew、pipx、npm、cargo 四个地方分别装了 —— 一个 mise use --global 全搞定。

7.3 平台 / 系统限制

1
2
3
[tools]
ripgrep = { version = "latest", os = ["linux", "macos"] }
"cargo:eza" = { version = "latest", os = ["linux", "macos"], locked = false }

只在 macOS / Linux 装,Windows 不装。

7.4 装好之后跑命令

1
2
3
4
5
6
7
8
# 不激活 shell,直接用
$ mise exec -- python@3.13 -- python -c "print(1+1)"
2

# 或者临时切版本
$ mise shell python@3.11
$ python --version
Python 3.11.x

八、mise.toml 完整示例

一个真实项目mise.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
27
28
29
30
31
# 工具版本
[tools]
node = "22.11.0"
python = "3.12.7"
go = "1.23.4"
terraform = "1.10"
kubectl = "1.31"
jq = "latest"
"github:BurntSushi/ripgrep" = "latest"
"npm:typescript" = "5.7"
"pipx:ruff" = "0.8"

# 环境变量
[env]
NODE_ENV = "production"
DATABASE_URL = { required = "Set DATABASE_URL before running" }
_.file = ".env"

# 任务
[tasks]
fmt = "ruff format ."
lint = "ruff check ."
test = "pytest -v"
build = "go build -o bin/myapp ."

[tasks.ci]
run = ["fmt", "lint", "test", "build"]

# 任务里用到的环境变量
[tasks.test]
env = { PYTHONPATH = "src" }

这一个文件能替代:.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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ git clone git@github.com:acme/webapp.git
$ cd webapp
$ cat mise.toml
[tools]
node = "22.11.0"
[env]
DATABASE_URL = { required = true }
[tasks]
dev = "vite"
test = "vitest"

$ mise install
✓ node 22.11.0 installed

$ mise run dev
vite v5.4.0 ready in 234 ms
➜ Local: http://localhost:5173/

没有” 先装 nvm、再装 Node、再装依赖” 这一长串

10.2 切到另一个项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ cd ~/work/old-rails-app
$ cat mise.toml
[tools]
ruby = "3.1.2"
node = "16.20"

$ mise install
✓ ruby 3.1.2 installed
✓ node 16.20.0 installed

$ ruby --version
ruby 3.1.2p20 ← 自动切了
$ node --version
v16.20.0 ← 自动切了

完全不同的版本组合,cd 之间无缝切换

10.3 部署到 CI

mise 有官方 mise-action 给 GitHub Actions 用:

1
2
3
# .github/workflows/ci.yml
- uses: jdx/mise-action@v2
- run: mise run ci

CI 跟本地用的是完全一样的环境 ——mise.toml 是 source of truth。


十一、避坑指南

11.1 装了 mise 但没生效

症状node --version 还是系统版本。

原因:shell 启动时没加载 mise activate

修法

1
2
3
4
5
# 确认 ~/.zshrc 或 ~/.bashrc 有这行
eval "$(~/.local/bin/mise activate zsh)"

# 重新开 shell,或者
source ~/.zshrc

11.2 装工具慢

症状mise install 卡半天。

原因:默认从 GitHub / NodeSource 下载,国内可能慢。

修法

1
2
3
4
5
# mise.toml
[settings]
# 改成国内镜像
node.mirror_url = "https://npmmirror.com/mirrors/node/"
github.access_token = "ghp_xxx" # 提高 API 限流

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 个


相关链接