前言:为什么要用 mise?

作为一个开发者,你是否遇到过这样的场景:

  • 项目 A 需要 Node.js 18,项目 B 需要 Node.js 20,你不得不在 nvm 中来回切换
  • 同时维护 Python、Java、Go 项目,每个语言都有自己的版本管理工具(pyenv、jenv、gvm),记不清命令
  • 换台新电脑,需要手动安装和配置一整套开发环境,耗时半天
  • asdf 虽然统一了版本管理,但 shim 机制带来的延迟让人烦躁,尤其是大型 monorepo 中 cd 一下都要卡顿

mise(读作 “meez”,源自法语 “mise en place”,意为”一切就位”)就是为解决这些问题而生的新一代开发环境管理工具。

它的核心优势可以用一张表格看清楚:

维度 asdf (0.16+) mise 实际感受
核心语言 Go Rust mise 启动/切换快 2-5 倍
shim 机制 有(明显延迟) 无(直接修改 PATH) cd 项目瞬间生效
环境变量 需 direnv 原生支持 少装一个工具
任务运行 无(靠 Makefile) 内置 task runner 可替代 Makefile
配置文件 .tool-versions .mise.toml + 兼容旧格式 更强大灵活

简单说,mise = asdf + direnv + make,但用 Rust 写成,更快、更现代。


一、安装 mise

快速安装(推荐)

绝大多数用户只需执行这一条命令:

curl https://mise.run | sh

安装完成后,mise 会被放在 ~/.local/bin/mise。
验证安装:

mise --version

你应该能看到类似输出:

2026.5.16 windows-x64 (2026-05-28)

其他安装方式

macOS + Homebrew:

brew install mise

Linux(apt/deb):

sudo apt update && sudo apt install -y gpg
sudo install -dm 755 /etc/apt/keyrings
wget -qO - https://mise.jdx.dev/gpg-key.pub | gpg --dearmor | sudo tee /etc/apt/keyrings/mise-archive-keyring.gpg 1>/dev/null
echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.gpg arch=amd64] https://mise.jdx.dev/deb stable main" | sudo tee /etc/apt/sources.list.d/mise.list
sudo apt update
sudo apt install -y mise

Windows:

mise 对 Windows 有良好的原生支持,推荐通过 Scoop 安装:

scoop bucket add main
scoop install mise

Shell 集成(关键步骤)

为了让 mise 在 cd 进入目录时自动切换工具版本,需要将以下命令添加到你的 shell 配置文件中:

Zsh(编辑 ~/.zshrc):

echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc
source ~/.zshrc

Bash(编辑 ~/.bashrc):

echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
source ~/.bashrc

Fish(编辑 ~/.config/fish/config.fish):

echo '~/.local/bin/mise activate fish | source' >> ~/.config/fish/config.fish

基础使用

安装并切换工具版本

mise 支持数百种开发工具:Node.js、Python、Java、Go、Rust、Terraform 等等。

安装特定版本:

# 安装 Node.js 20
mise install node@20

# 安装 Python 3.12
mise install python@3.12

# 安装 Go 1.21
mise install go@1.21

全局设置(默认版本):

mise use --global node@20
mise use --global python@3.12

之后在终端中直接运行 node -v 就会是 20.x 版本。

项目级设置(推荐做法):

在项目根目录下执行:

cd my-project
mise use node@18
mise use python@3.11

这会在当前目录生成一个 .mise.toml 文件,记录项目需要的工具版本。团队成员 clone 代码后,只需执行 mise install 即可自动安装所有依赖。

查看当前使用的版本:

mise current
mise ls # 列出所有已安装工具
mise ls --current # 只列出当前激活的

模糊版本匹配(省心功能)

mise 支持灵活的版本写法,不用死记精确版本号:

# 安装最新的 20.x 版本
mise use node@20

# 安装最新的 LTS 版本
mise use node@lts

# 安装最新版
mise use node@latest

# 安装 3.12 的最新补丁版本
mise use python@3.12

临时使用特定版本

如果你只是临时想用一个不同版本,不需要修改配置:

# 临时使用 node@22 执行命令
mise exec node@22 -- node -v

# 或进入一个带有特定版本的 subshell
mise shell node@18

迁移旧项目

如果你有使用 asdf 或 nvm 的旧项目,mise 可以直接读取它们的配置文件。
启用旧配置文件兼容:

mise settings set legacy_version_file true

然后 mise 就能自动识别 .tool-versions.nvmrc.python-version 等文件。
将 asdf 配置迁移到 mise:

mise import-asdf           # 导入已有工具
mise generate mise.toml --tool-versions # 生成新的配置

环境变量管理(替代 direnv)

mise 不仅可以管理工具版本,还能管理项目级的环境变量。这意味着你不再需要 direnv。
在项目的 .mise.toml 中添加 [env] 部分:

[env]
NODE_ENV = "development"
API_KEY = "your-api-key-here"
DATABASE_URL = "postgresql://localhost:5432/myapp"
DEBUG = "true"

当你 cd 进入这个目录时,这些环境变量会自动加载。

结合 .env 文件:

mise 也支持从 .env 文件读取变量,只需在配置中引用:

[env]
_ = { file = ".env" } # 加载整个 .env 文件

设置和查看环境变量:

mise set SOME_VAR=bar      # 设置变量
mise env # 查看当前环境变量

任务运行(替代 Makefile)

mise 内置了任务运行器,可以替代 Makefile 或 npm scripts。
.mise.toml 中定义任务:

[tasks.build]
description = "构建项目"
run = "npm run build"

[tasks.test]
description = "运行测试"
run = "npm test && pytest"
depends = ["lint"] # 依赖 lint 任务先执行

[tasks.lint]
description = "代码检查"
run = """
biome check --write .
ruff check --fix
"""

[tasks.dev]
description = "启动开发服务器"
run = "npm run dev"

[tasks.deploy]
description = "部署到生产环境"
depends = ["test", "build"] # 先 test 再 build
run = "terraform apply -auto-approve"

执行任务:

mise run build          # 运行 build 任务
mise run test # 运行 test(会自动先运行 lint)
mise run dev # 启动开发服务器
mise r deploy # r 是 run 的简写
mise deploy # 如果名称不与 mise 命令冲突也可直接用

任务的高级特性:

  • 文件变更检测:只有源文件变更时才重新执行
[tasks.build]
run = "cargo build"
sources = ["src/**/*.rs", "Cargo.toml"]
outputs = ["target/debug/myapp"]
  • 传参:
mise run build --release    # 参数会传递给任务内的命令 
  • 并行执行:默认最多 4 个任务并行,可通过 –jobs 调整

实战:一个完整的多语言项目配置

假设你有一个全栈项目,前端用 Node.js 20 + Bun,后端用 Python 3.12 + Go 1.21,还用了 Terraform 管理基础设施。
项目的 .mise.toml 看起来像这样:

# 工具版本定义
[tools]
node = "20" # Node.js 20.x
bun = "latest" # 最新 Bun
python = "3.12" # Python 3.12
go = "1.21" # Go 1.21
terraform = "1.6" # Terraform 1.6.x

# 环境变量
[env]
NODE_ENV = "development"
DEBUG = "true"
DATABASE_URL = "postgresql://localhost:5432/app"
GO_ENV = "dev"

# 开发任务
[tasks.dev]
description = "启动前后端开发服务器"
run = [
{ task = "dev:frontend" },
{ task = "dev:backend" },
]

[tasks."dev:frontend"]
description = "启动前端 dev server"
run = "bun run dev"
dir = "frontend" # 在 frontend 目录下执行

[tasks."dev:backend"]
description = "启动后端服务"
run = "go run ./cmd/server"
dir = "backend"

[tasks.test]
description = "运行所有测试"
depends = ["test:backend", "test:frontend"]

[tasks."test:backend"]
run = "go test -v ./..."
dir = "backend"

[tasks."test:frontend"]
run = "bun test"
dir = "frontend"

[tasks.build]
description = "构建生产版本"
depends = ["build:frontend", "build:backend"]

[tasks."build:frontend"]
run = "bun run build"
dir = "frontend"

[tasks."build:backend"]
run = "go build -o bin/app ./cmd/server"
dir = "backend"

[tasks.deploy]
description = "部署到生产环境"
depends = ["test", "build"]
run = "terraform apply -auto-approve"
env = { NODE_ENV = "production" } # 覆盖环境变量

团队成员上手流程:

# 1. 克隆项目
git clone https://github.com/company/myapp.git
cd myapp

# 2. 一条命令安装所有工具
mise install

# 3. 启动开发
mise run dev

# 4. 提交代码前测试
mise run test

新成员从零到运行项目,只需要 3 条命令,无需手动安装任何语言环境。

从 asdf 迁移(实操指南)

如果你正在使用 asdf,迁移到 mise 非常平滑。

第 1 步:安装 mise(按第一节的步骤)

第 2 步:启用兼容模式

mise settings set legacy_version_file true

第 3 步:导入 asdf 已安装的工具

mise import-asdf

第 4 步:测试验证

cd ~/your-project
node -v # 应该和 asdf 管理的版本一致
python -v

第 5 步:生成 mise 原生配置(可选但推荐)

mise generate mise.toml --tool-versions

第 6 步:确认没问题后,清理 asdf

# 移除 asdf 目录
rm -rf ~/.asdf

# 从 ~/.zshrc 或 ~/.bashrc 中删除 asdf 相关行
# 重启终端

常见问题

Q1: 安装后 mise 命令找不到?

确保 ~/.local/bin 在你的 PATH 中。可以添加到 shell 配置:

echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc

Q2: 进入项目目录后版本没有自动切换?

检查是否已正确配置 shell 集成(见 1.3 节)。同时确认 .mise.toml.tool-versions 存在于项目根目录。

Q3: 与现有 nvm/pyenv 冲突吗?

mise 接管 PATH 后会优先使用自己管理的版本。建议卸载其他版本管理工具以避免冲突,但 mise 也兼容它们的存在。

Q4: Windows 下路径问题?

mise 原生支持 Windows,但建议使用 WSL2 + Ubuntu 获得最佳体验。如果必须在原生 Windows 下使用,确保 shell 配置文件路径正确。

Q5: 如何更新 mise?

mise upgrade

或重新运行安装脚本:

curl https://mise.run | sh

总结

mise 将版本管理、环境变量、任务运行三大功能整合在一个工具中,用 Rust 带来的高性能告别了 asdf 的 shim 延迟。无论是个人开发者还是团队协作,mise 都能显著提升开发环境的配置效率。

核心优势回顾:

  • 统一入口:告别 nvm/pyenv/gvm/asdf 的组合混战
  • 性能出色:直接修改 PATH,无 shim 层,cd 瞬间切换
  • 兼容性强:可直接读取现有配置文件,迁移成本极低
  • 功能全面:内置 env 和 task 管理,减少依赖
  • 跨平台:Linux、macOS、Windows 都有良好支持

从今天开始,让你的开发环境”一切就位”(mise en place)吧。

更多资源: