mise 是 asdf 系的多语言版本管理器:一份 TOML 声明工具与版本,进目录自动切换,脚本里用 mise exec 固定环境。我把它和 dotfiles 一起用,替代以前在 Homebrew / fnm / SDKMAN 之间拆版本的做法。机器级安装步骤见 macOS 开发环境配置。
装什么、装在哪
| 文件 | 作用 |
|---|---|
~/.config/mise/config.toml | 全局默认(我链到 dotfiles 里的 dotfiles/mise/config.toml) |
项目根 mise.toml | 覆盖该仓库的 Node、pnpm、Java 等 |
package.json 的 packageManager | 与 pnpm 版本应对齐,Corepack/CI 会读它 |
安装 mise:
curl -fsSL https://mise.run | sh
Shell 里启用(dotfiles 已在 ~/.zshrc 末尾):
eval "$(mise activate zsh)"
首次或改配置后:
mise install
我的全局配置摘要
[tool_alias]
pnpm = "npm:pnpm"
[tools]
java = [
"oracle-graalvm-25.0.5.0.3",
"oracle-graalvm-21.0.12.1.1",
"oracle-graalvm-17.0.12",
"temurin-27",
"zulu-8",
]
maven = "3.10.0"
gradle = "latest"
spring-boot = "4.1.0"
python = "3.13.16"
node = "26.9.0"
pnpm = "12.17.0"
pipx = "1.18.3"
要点:
- Java 数组:第一项是默认
java(当前 GraalVM 25);其余用mise shell java@…或别名临时切换。 pnpm = "npm:pnpm":本机 aqua 发布的 pnpm 包解压失败时,改走 npm 后端;写版本仍用pnpm = "12.17.0",需要旧主版本时用mise exec npm:pnpm@10.34.9 -- pnpm …。- Spring Boot CLI:在
[plugins]里 pin 社区 asdf 插件 URL(见 dotfiles 完整文件)。
常用命令
mise ls # 已安装版本
mise ls --current # 当前目录生效版本
mise where node # 解析后的安装路径
mise install # 按 config + mise.toml 补缺
mise install node@26.9.0 # 只装某一工具
单次命令(不污染当前 shell,适合 CI 脚本):
mise exec -- pnpm install
mise exec npm:pnpm@8.15.9 -- pnpm --dir ~/github/running_page install
mise exec -- ./mvnw test
当前 shell 临时改版本(关掉终端或 mise shell --unset java 失效):
mise shell java@oracle-graalvm-21
mise shell node@26.13.0
dotfiles 里别名:j8 / j17 / j21 / j25 / j27 对应 mise shell java@…。
项目级 mise.toml
进目录后,mise 合并全局 config + 项目 mise.toml,项目优先。
示例:
# 博客仓库:只 pin 前端栈
[tools]
node = "26.13.0"
pnpm = "12.16.1"
# Java 演示项目:编译目标 21
[tools]
java = "oracle-graalvm-21"
maven = "3.10.0"
# 老前端:pnpm 8 主版本
[tools]
python = "3.13.16"
node = "26.9.0"
pnpm = "8.15.9"
cd 进目录后执行 mise ls --current,确认 node/java/pnpm 来源列指向该项目的 mise.toml。
与 Corepack / GitHub Actions 一起用时:package.json 的 packageManager、本地 mise.toml、CI 里的 pnpm/action-setup 版本应一致,避免「本地能装、CI 锁文件不过」。
任务(tasks)
部分仓库在 mise.toml 里定义 [tasks],例如:
mise run test
mise tasks ls
带 secrets 或非纯版本字段的配置可能需要 mise trust。日常只读 [tools] 时通常不必 trust。
维护
| 目的 | 做法 |
|---|---|
| 升全局 Node / pnpm | 改 dotfiles mise/config.toml → mise install → 提交 dotfiles |
| 升单项目 | 改该项目 mise.toml + packageManager → mise install |
| 看缺什么 | mise ls 里带 (missing) 的项 → mise install |
| 卸旧版 | mise uninstall pnpm@12.5.1(确认无项目再 pin) |
Homebrew 仍装 git、gh、Ghostty 等;不要再用 Brew 装 Node/Python/pnpm,以免和 mise 的 PATH 抢优先级。
排错
pnpm版本不对:看mise ls --current;是否被项目mise.toml覆盖;是否应用了tool_alias后应用npm:pnpm@版本执行。- Java 版本不对:确认
java = [...]第一项;或项目mise.toml是否写了java = "oracle-graalvm-17"等。 - 进目录没切换:是否
mise activate zsh;新开终端是否加载了~/.zshrc。 - aqua 装 pnpm 失败:在全局加
[tool_alias] pnpm = "npm:pnpm"(见上文)。