原名 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命令字符串或数组(数组 = 顺序执行多步)
descriptionmise 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> 三层含义:
    1. mise exec 保证子进程用 [tools] 钉住的 node/pnpm,而非 shell 里碰巧命中的版本;
    2. node scripts/mise-run.mjs 是仓库自建包装层,通常处理信号转发(Ctrl-C)、TTY/stdin 接管、退出码透传等——直接用 pnpm xxx 跑长驻进程容易踩坑;
    3. 最后才是真正的 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)再清理,属安全设计,勿误判为「没升级」。

相关页面

  • nvm / n — Node 专用版本管理器,mise 是其多语言替代
  • corepack — 与 mise 的版本控制权冲突及规避
  • pnpm — 样例中被钉版本的包管理器
  • 07-environment-variables — ELECTRON_MIRROR 等 Electron 环境变量
  • index — Node.js 工具链总览