原名 rtx,读音 “meez”,取自 mise-en-place(法餐「备料就位」)。Rust 实现的多语言开发环境前端:一个
mise.toml同时管工具版本、环境变量和任务,替代 asdf / nvm / pyenv / direnv / make / npm scripts 的组合。
一句话定位
把「装对工具版本 + 设对环境变量 + 跑对命令」三件散落的事,收敛到项目根目录一个声明式配置文件里,在 shell、编辑器、CI 中行为一致。
为什么值得关注
- 三合一:版本管理(tools)+ 环境管理(env)+ 任务运行(tasks)一个 CLI 全包,减少工具链拼装。
- 多语言:不限于 Node,Node/Python/Go/Ruby/Terraform… 1000+ 工具注册表,天然适合 polyglot monorepo。
- 性能:Rust 实现,比 asdf 快一个量级;任务运行无需
mise activate也能自动装载工具与环境。 - 供应链安全:集成 Cosign、GitHub Artifact Attestations 做制品校验,这是多数版本管理器缺的。
- 可渐进采用:能只用其中一块(比如先只做版本管理),与现有语言工具链共存,不必一次性迁移。
Thoughtworks 技术雷达 Vol.34(2026-04)已将其从 Trial 提升到 Adopt,定位为团队开发环境搭建的推荐默认。
三块能力
| 关注点 | 配置块 | 替代 | 作用 |
|---|---|---|---|
| 工具版本 | [tools] | asdf / nvm / pyenv | 按目录切换各语言运行时版本 |
| 环境变量 | [env] | direnv / .env + oh-my-zsh 插件 | 进入项目自动注入变量、加载 .env |
| 任务 | [tasks] | make / npm scripts | 命名任务,用项目自身工具链与环境执行 |
mise.toml 配置结构
[tools] — 钉版本
[tools]
node = "24.14.0" # 精确版本
pnpm = "10.33.2"
python = "3.14" # "3.14" 是「3.14 系列」,非精确钉版注意:
"24"/"3.14"这类是版本请求(某一系列的最新),要精确复现需配 lockfile(mise.lock)。写全24.14.0才是硬钉。
[env] — 环境变量
[env]
COREPACK_ENABLE_PROJECT_SPEC = "0"
ELECTRON_MIRROR = "https://npmmirror.com/mirrors/electron/"支持静态值、从命令取值、按目录作用域、模板变量(如 {{env.HOME}})等。
[tasks.<name>] — 任务
[tasks.dev]
description = "Start the desktop app in an isolated local test environment."
env = { ZCODE_DATA_BASE_DIR = "{{env.HOME}}/.zcode-dev-home" }
run = "mise exec -- node scripts/mise-run.mjs pnpm dev:desktop:test"任务关键属性:
| 属性 | 说明 |
|---|---|
run | 命令字符串或数组(数组 = 顺序执行多步) |
description | mise tasks ls 中展示 |
depends | 前置任务,列表内可能并行执行,顺序不保证;要串行用 run 数组 |
env | 任务级环境变量覆盖(会与全局 [env] 合并) |
file | 执行外部脚本,支持相对路径 / URL / git:: 源 |
实战样例:一个 TS 桌面项目的 mise.toml
以下是某 TypeScript 桌面应用仓库的根配置(原始内容),可作为工程模板理解:
[tools]
node = "24.14.0"
pnpm = "10.33.2"
[env]
COREPACK_ENABLE_PROJECT_SPEC = "0"
ELECTRON_MIRROR = "https://npmmirror.com/mirrors/electron/"
[tasks.install]
description = "Install root workspace dependencies with the pinned pnpm."
run = "mise exec -- node scripts/mise-run.mjs pnpm install"
[tasks.bootstrap]
description = "Run the repository bootstrap script after installing dependencies."
depends = ["install"]
run = "mise exec -- node scripts/mise-run.mjs pnpm bootstrap"
[tasks.dev]
description = "Start the desktop app in an isolated local test environment."
env = { ZCODE_DATA_BASE_DIR = "{{env.HOME}}/.zcode-dev-home" }
run = "mise exec -- node scripts/mise-run.mjs pnpm dev:desktop:test"
[tasks.typecheck]
description = "Run the root TypeScript project references check."
run = "mise exec -- node scripts/mise-run.mjs pnpm typecheck"
[tasks.lint]
description = "Run the root linter."
run = "mise exec -- node scripts/mise-run.mjs pnpm lint"逐块解读
[tools]钉 node/pnpm:团队成员mise install后拿到的运行时完全一致,不再依赖.nvmrc+ 全局 pnpm。COREPACK_ENABLE_PROJECT_SPEC=0:禁用 corepack 读取package.json的packageManager。否则 corepack 会与 mise 抢 pnpm 版本控制权、甚至触发额外下载。版本已由 mise 管,就该关掉(对比 corepack)。ELECTRON_MIRROR:Electron 二进制走国内镜像,绕开 GitHub 下载慢的问题(详见 07-environment-variables)。- 统一调用形态
mise exec -- node scripts/mise-run.mjs pnpm <script>三层含义:mise exec保证子进程用[tools]钉住的 node/pnpm,而非 shell 里碰巧命中的版本;node scripts/mise-run.mjs是仓库自建包装层,通常处理信号转发(Ctrl-C)、TTY/stdin 接管、退出码透传等——直接用pnpm xxx跑长驻进程容易踩坑;- 最后才是真正的
pnpm <script>。
bootstrap用depends = ["install"]:mise run bootstrap自动先跑 install,省去手敲两步。dev用任务级env覆盖数据目录:ZCODE_DATA_BASE_DIR指向~/.zcode-dev-home,开发时用独立数据目录与生产/正常用户数据隔离;配套的dev-desktop-prod则不开隔离 env,直连生产以复现线上问题。
常用命令
curl https://mise.run | sh # 安装(macOS/Linux);Windows: winget install jdx.mise
mise use node@24 # 安装并写入 mise.toml
mise install # 按 mise.toml 安装所有工具
mise exec node@24 -- node -v # 用指定版本跑一次命令,不激活 shell
mise run <task> # 跑任务
mise tasks ls # 列出所有任务
mise tasks info <task> # 查看单个任务详情
mise config ls # 查看当前目录生效的配置文件
mise ls --current # 当前选中的工具版本
mise doctor # 体检安装与 shell 激活
eval "$(mise activate zsh)" # 激活 shell:进目录自动切工具/设变量(可选)配置文件名优先级:mise.toml(本地)/ .mise.toml(旧)/ ~/.config/mise/config.toml(全局)。
与相邻工具的关系
| 你现在的做法 | mise 的对应 | 备注 |
|---|---|---|
| nvm / n 切 Node 版本 | [tools] | mise 可管多语言,nvm 只管 Node |
.env + direnv | [env] | 进入目录自动注入 |
| Makefile / npm scripts | [tasks] | 用项目自身工具链与环境跑 |
| asdf | 整体替代 | mise 是 asdf 的高性能超集(并发下载、更快解析) |
踩坑点
- 版本请求 ≠ 精确钉版:
"24"是系列非精确版本,跨机器复现要未锁 lockfile 就可能拿到不同小版本。 - corepack 冲突:mise 管 pnpm 时应设
COREPACK_ENABLE_PROJECT_SPEC=0,否则两者的版本解析可能互相覆盖(如上面的样例)。 depends会并行:depends中多个前置任务可能并发执行,有先后依赖时要改用run数组。- 未激活 shell 时:直接敲
node不会自动用项目版本,需mise exec或mise activate。 - 升级不再立即删旧版:
mise upgrade会把被替换的旧版本按 grace period 保留(默认约 24h)再清理,属安全设计,勿误判为「没升级」。