如何用 mise deps 在输入变化时自动运行 npm、pip 等依赖安装器?
【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/mise
mise deps是 mise 提供的依赖管理功能(目前标记为experimental):它对项目中的关键输入文件(如package.json、package-lock.json、requirements.txt)做哈希比较,当这些输入相对上一次成功运行发生变化、或输出目录丢失时,自动调用你配置的包管理器(npm install、pip install -r requirements.txt等)。配合auto = true,在mise run、mise x(exec)执行前还会自动做一次检查,避免手动敲安装命令。
本文的目标:在一个已有 npm 锁文件的项目中配置mise deps,验证“输入不变则跳过、输入变化则重装”的行为,并扩展出 pip 安装器的启用方式。
准备条件
- 项目已经存在对应的输入文件。npm 安装器要求项目中有
package.json和package-lock.json; - 功能处于实验阶段,配置里必须开启
experimental = true; - 包管理器本身通过
[tools]安装(例如 node)。[tools]负责装包管理器,[deps]负责装项目依赖,两者分开。
如果项目还没有锁文件,先用自己的包管理器生成一个,再配置 provider;否则 provider 缺少必需输入不会生效。
配置 npm 安装器
在项目的mise.toml中加入(来自 deps 文档的 Quick Start):
[settings] experimental = true [tools] node = "24" [deps.npm] auto = true要点:
auto = true表示该 provider 在mise run和mise x之前自动检查并安装;不写auto(空表[deps.npm])只会启用 provider 但不自动运行。- 空表
[deps.uv]这种写法可以选择内置 provider 而不设为自动;要禁用某个(例如从上层配置继承来的)provider,用[deps]下的disable = ["npm"]。禁用只是阻止运行,不会卸载已安装的包。
npm 内置 provider 的默认值:输入为package.json、package-lock.json,跟踪输出为node_modules/,默认命令为npm install。yarn、pnpm、bun、deno、go、pip、poetry、uv、bundler、composer、dart、flutter、git-submodule 等同样有内置 provider,各自的输入、输出和默认命令见 deps 文档的 Built-in Providers 表格。
执行并验证
按顺序执行:
mise install mise deps install --list mise deps install npm mise deps install npm --explainmise install安装[tools]中的 node;mise deps install --list列出当前生效的 provider,用来确认配置是否被正确解析;mise deps install npm只安装指定 provider;--explain解释本次判定的结果:provider 为什么被认为是新鲜(fresh)或过期(stale)。这是排查“为什么没跑/为什么跑了”的主要手段。
判定逻辑(文档 Freshness Checking 一节):
- 对全部 source 文件计算 blake3 哈希;
- 对生效的 provider 命令计算 blake3 哈希(包含 run 命令、shell、provider
env、工作目录;原始命令和环境值不写入状态); - 与上一次成功运行保存的哈希比较;
- source 或生效命令被新增、删除、修改时,标记为过期(stale)。
哈希状态保存在$MISE_STATE_DIR/deps/<hash>.toml,按项目根目录索引,不会写入项目目录内。
由此可以确认行为:首次运行必然是 stale(没有上次成功的记录);之后只要输入文件或命令没变,provider 保持 fresh,安装命令不会再执行。必需输出(如node_modules/)必须存在,被删除后会触发重装。
自动触发与跳过
配置auto = true后,mise exec和mise run在每次执行前都会走同一套 sources/outputs 检查,确保被跟踪的变化在处理完之后才执行后续命令。注意两点文档明确给出的边界:
- 自动检查不会把包升级到最新上游版本,只处理被跟踪输入的变化;
- 单次调用想跳过自动安装:
mise run --no-deps build mise x --no-deps -- npm test文档中的示例还给出了一种用法:项目还没有锁文件时,先用mise exec --no-deps -- npm install生成锁文件,避免在生成过程中被 deps 检查干扰。
启用mise activate后,如果某个auto = true的 provider 已过期,mise 会输出文档示例中的警告(原文格式):
mise WARN deps: npm may need update, run `mise deps`不想看到该警告时,在配置中加入:
[settings] status.show_deps_stale = false为 pip 项目启用安装器
同样用空表加auto的方式启用:
[deps.pip] auto = true内置 pip provider 的默认值:输入为requirements.txt(不需要锁文件),跟踪输出为可选的.venv/,默认命令为pip install -r requirements.txt。
“可选输出”的含义:只有当 mise 在某次成功运行之后观察到过.venv/,它被删除才会触发重装——这对默认安装到项目外的包管理器很重要。文档同时明确:pip provider 不会创建或选择 virtualenv。如果你希望 pip 装进.venv,需要先按 Python 虚拟环境自动激活 一节配置_.python.venv(例如[env]下_.python.venv = { path = ".venv", create = true })。
可选分支:锁定安装与多安装器并行
如果要求 npm 走干净、基于锁文件的安装而不是普通npm install,覆盖run即可,新鲜度检查仍然决定是否执行它:
[deps.npm] run = "npm ci"多个 provider(如 npm 和 pip 同时启用)会并行执行,并受jobs设置限制并发:
[settings] jobs = 4 # Run up to 4 providers in parallel需要顺序时,用depends声明 provider 之间的依赖;无依赖的 provider 之间并行,依赖失败的 provider 会连带跳过其下游,循环依赖会被检测并跳过。
已知限制
- provider 必须显式配置,且具备必需的输入文件;除
go(go.mod)、pip(requirements.txt)、Dart/Flutter(pubspec.yaml)、git-submodule(非空.gitmodules)外,大多数 provider 需要锁文件。 - 新鲜度检查不会检查每个已安装的包、不查询上游新版本,也检测不到未被跟踪的外部缓存目录的删除。如果依赖文件在项目外被改动,用
mise deps install --force强制执行修复;mise deps install <provider> --explain可查看判定细节,--dry-run显示将会执行什么但不执行,--skip npm跳过指定 provider。 mise deps默认只运行当前配置根的 provider。monorepo 场景需要monorepo_root = true加显式[monorepo].config_roots(见 Config Roots),并配合mise deps --monorepo;mise 不会去任意子目录搜索 provider。单个嵌套项目更简单的做法是给 provider 设dir = "apps/api"。- 对内置 provider,配置
sources或outputs是替换默认值而不是追加;outputs = []会显式关闭该 provider 的输出跟踪(包括可选输出)。
小结
配置完成后,验证路径是:mise deps install --list确认 provider 生效 →mise deps install npm首次运行(首次必为 stale)→ 改动package-lock.json后再跑mise deps install npm --explain,能看到过期判定并重新执行安装命令;不改输入则命令保持 fresh 不执行。auto = true之后,mise run/mise x会自动完成同样的检查,--no-deps用于单次跳过。功能仍是 experimental,配置中的experimental = true必须保留。更多细节(自定义 provider、模板变量、依赖声明)见 docs/dev-tools/deps.md。
【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/mise
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考