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.tomlMISE_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 大致按以下顺序拼接(越靠前优先级越高):

  1. activate 注入的运行时目录
  2. mise shims
  3. Scoop shims
  4. 系统目录及其他自定义目录

mise 层的优先级必须高于 Scoop 层。 Scoop 管理的 node/python 排在前方时会覆盖 mise 的版本切换。每层安装工具后,使用 where.exe nodemise 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,进入目录自动切换