Windows 工具链按职责分为两层:Scoop 管理应用与 CLI 工具,mise 管理语言运行时及其版本切换。该结构缩短 PATH 排查路径,并明确版本冲突的归属。
分工边界
| 层 | 管理器 | 管什么 | 典型内容 |
|---|---|---|---|
| 应用层 | Scoop | 桌面应用、独立 CLI 工具 | git、7zip、bat、ripgrep、PowerShell、mise 本体 |
| 运行时层 | mise | 语言运行时及版本 | node、bun、python、go、java、rust |
分类标准:具有版本切换需求的工具(多个项目分别依赖特定版本)归 mise;采用单版本生命周期的工具归 Scoop。 git 由 Scoop 安装和更新;node 由 mise 根据项目配置切换版本。
职责约束:
- git、7zip 等单版本工具由 Scoop 管理,保持直接的更新路径。
- node、python 等运行时由 mise 管理,以支持项目级版本切换并集中维护 PATH。
安装 Scoop
irm get.scoop.sh -outfile 'scoop-setup.ps1'
.\scoop-setup.ps1 -ScoopDir '<自定义目录>' -ScoopGlobalDir '<自定义全局目录>'
省略 -ScoopDir 时,安装路径默认为 %USERPROFILE%\scoop。
添加常用 bucket:
scoop bucket add main
scoop bucket add extras
基础工具安装:
scoop install git 7zip
scoop install pwsh windows-terminal
scoop install bat delta difftastic eza fzf ripgrep fd dust duf bottom
scoop install neovim
安装 mise
mise 本体属于 Scoop 包,运行时管理器由应用层管理:
scoop install mise
mise --version
mise 的数据与缓存默认放在用户目录,可用环境变量重定向到独立目录:
[Environment]::SetEnvironmentVariable('MISE_DATA_DIR', '<数据目录>', 'User')
[Environment]::SetEnvironmentVariable('MISE_CACHE_DIR', '<缓存目录>', 'User')
全局工具配置路径为 %MISE_CONFIG_DIR%\config.toml;MISE_CONFIG_DIR 省略时,路径默认为 %USERPROFILE%\.config\mise\config.toml:
[tools]
node = "lts"
bun = "latest"
python = "latest"
go = "1.22"
java = "21"
rust = "stable"
latest/lts/stable:跟随对应发布渠道,mise upgrade时更新。- 固定版本号:锁定全局默认值,适用于稳定环境。
- 项目级配置文件为仓库根目录的
mise.toml或.mise.toml,优先级高于全局配置;进入目录时自动切换。
项目级版本固定
# 项目根目录 mise.toml
[tools]
node = "22"
bun = "latest"
mise install # 按当前目录配置安装缺失版本
mise ls # 列出已装版本及来源
mise current # 显示当前目录生效的版本
mise which node # 查看 node 实际解析路径
mise use node@22 # 写入当前目录配置并安装
mise use -g bun@latest # 修改全局配置
mise doctor 用于检查 PATH 与 shim 状态,适用于新运行时安装后的命令解析验证。
PATH 生效方式
mise 通过以下两种方式将运行时接入 PATH:
| 方式 | 原理 | 适用 |
|---|---|---|
| shims | shims 目录放置转发器,按所在目录解析 | 跨 shell 通用,独立于 shell 钩子 |
| activate | shell 启动时注入钩子,进入目录改写 PATH | PowerShell 下更透明 |
PowerShell / pwsh 用 activate:
# $PROFILE
mise activate pwsh | Out-String | Invoke-Expression
Git Bash 推荐使用 shims:将 shims 目录加入 PATH,保持静态 PATH 配置。
两层 PATH 的顺序
最终 PATH 大致按以下顺序拼接(越靠前优先级越高):
- activate 注入的运行时目录
- mise shims
- Scoop shims
- 系统目录及其他自定义目录
mise 层的优先级必须高于 Scoop 层。 Scoop 管理的 node/python 排在前方时会覆盖 mise 的版本切换。每层安装工具后,使用 where.exe node 或 mise which node 验证解析路径。
日常维护
# Scoop
scoop update # 更新 bucket 与 Scoop 自身
scoop update --all # 更新全部应用
scoop status # 检查过期
scoop cleanup * # 清理旧版本
scoop uninstall <app> -p # 卸载并清配置
# mise
mise upgrade # 升级 latest/lts 类工具
mise prune # 清理失去配置引用的版本
mise reshim # 重建 shims
mise doctor # 体检 PATH、shim、配置
版本清理策略:scoop cleanup * 与 mise prune 分别清理两层旧版本。升级前使用 mise ls 记录当前版本;出现回归时,执行 mise use <tool>@<旧版本> 回退。
注意事项
- shim 链排查:工具命令可能经过 Scoop shim → mise shim → 真实可执行文件多层转发。任一层失效均表现为命令解析失败。使用
mise which <tool>验证最终路径及目标文件的可访问性。 - 源码编译类包:部分语言(如 PHP)的某些版本在 Windows 上需要本地编译,缺少构建工具时会安装失败。优先选择官方预编译版本,或由 Scoop 管理该语言。
- 多 shell 版本差异:pwsh 中的自定义
.cmd/.ps1包装器按 PATHEXT 优先级覆盖 shim;Git Bash 直接解析 shim。包装器应固定目标可执行文件路径并重设 PATH,以统一两个 shell 的版本。 - 固定版本升级策略:
mise upgrade更新latest/lts/stable声明的工具;固定版本号通过手动修改配置升级。 - mise 升级路径:Scoop 安装的 mise 通过
scoop update mise升级。统一由 Scoop 管理 mise 本体,以保持单一管理入口。
一图总结
Scoop (应用层) mise (运行时层)
├─ git 7zip bat ripgrep ├─ node lts
├─ pwsh windows-terminal ├─ bun latest
├─ neovim bottom dust ├─ go 1.22
└─ mise ←── 管理器本体在这层 ├─ java 21
├─ python latest
└─ rust stable
项目内 mise.toml 覆盖全局 config.toml,进入目录自动切换