news 2026/9/11 22:27:13

如何用 mise deps 在输入变化时自动运行 npm、pip 等依赖安装器?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用 mise deps 在输入变化时自动运行 npm、pip 等依赖安装器?

如何用 mise deps 在输入变化时自动运行 npm、pip 等依赖安装器?

【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/mise

mise deps是 mise 提供的依赖管理功能(目前标记为experimental):它对项目中的关键输入文件(如package.jsonpackage-lock.jsonrequirements.txt)做哈希比较,当这些输入相对上一次成功运行发生变化、或输出目录丢失时,自动调用你配置的包管理器(npm installpip install -r requirements.txt等)。配合auto = true,在mise runmise x(exec)执行前还会自动做一次检查,避免手动敲安装命令。

本文的目标:在一个已有 npm 锁文件的项目中配置mise deps,验证“输入不变则跳过、输入变化则重装”的行为,并扩展出 pip 安装器的启用方式。

准备条件

  • 项目已经存在对应的输入文件。npm 安装器要求项目中有package.jsonpackage-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 runmise x之前自动检查并安装;不写auto(空表[deps.npm])只会启用 provider 但不自动运行。
  • 空表[deps.uv]这种写法可以选择内置 provider 而不设为自动;要禁用某个(例如从上层配置继承来的)provider,用[deps]下的disable = ["npm"]。禁用只是阻止运行,不会卸载已安装的包。

npm 内置 provider 的默认值:输入为package.jsonpackage-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 --explain
  • mise install安装[tools]中的 node;
  • mise deps install --list列出当前生效的 provider,用来确认配置是否被正确解析;
  • mise deps install npm只安装指定 provider;
  • --explain解释本次判定的结果:provider 为什么被认为是新鲜(fresh)或过期(stale)。这是排查“为什么没跑/为什么跑了”的主要手段。

判定逻辑(文档 Freshness Checking 一节):

  1. 对全部 source 文件计算 blake3 哈希;
  2. 对生效的 provider 命令计算 blake3 哈希(包含 run 命令、shell、providerenv、工作目录;原始命令和环境值不写入状态);
  3. 与上一次成功运行保存的哈希比较;
  4. source 或生效命令被新增、删除、修改时,标记为过期(stale)。

哈希状态保存在$MISE_STATE_DIR/deps/<hash>.toml,按项目根目录索引,不会写入项目目录内。

由此可以确认行为:首次运行必然是 stale(没有上次成功的记录);之后只要输入文件或命令没变,provider 保持 fresh,安装命令不会再执行。必需输出(如node_modules/)必须存在,被删除后会触发重装。

自动触发与跳过

配置auto = true后,mise execmise 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 必须显式配置,且具备必需的输入文件;除gogo.mod)、piprequirements.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,配置sourcesoutputs替换默认值而不是追加;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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 22:24:38

南京冷凝式壁挂炉维修服务,欧米到家专业检测节能采暖设备运行异常以及故障报警

文章简介南京冬季采暖需求较高&#xff0c;壁挂炉作为家庭供暖和生活热水的重要设备&#xff0c;长期使用后容易出现不点火、不供暖、热水忽冷忽热、故障代码报警、水压异常、漏水等问题。欧米到家专注南京壁挂炉维修服务&#xff0c;提供燃气壁挂炉、电壁挂炉、冷凝壁挂炉、采…

作者头像 李华
网站建设 2026/9/11 22:22:46

PyTorch面部表情识别实战:从CNN设计到ONNX部署

简介&#xff1a;本资源是一套面向深度学习初学者与进阶实践者的面部表情识别完整项目方案&#xff0c;基于PyTorch框架实现卷积神经网络&#xff08;CNN&#xff09;建模&#xff0c;覆盖数据预处理、模型训练、评估可视化及部署推理全流程&#xff0c;适用于课程设计、毕业设…

作者头像 李华
网站建设 2026/9/11 22:22:23

Android Jetpack Compose 状态管理浅析

掌握声明式UI的核心&#xff0c;构建高效、可维护的响应式应用在 Android Jetpack Compose 中&#xff0c;状态管理是构建响应式 UI 的核心基石。Compose 采用声明式编程范式&#xff0c;确立了 UI f(state) 这一根本原则——UI 是状态的函数&#xff0c;当状态变化时&#xf…

作者头像 李华
网站建设 2026/9/11 22:21:32

MISRA C:2025全面解读:C11/C17入轨与安全编码迁移实战

看到“MISRA C:2025”这几个字&#xff0c;我身边不少嵌入式工程师的第一反应是&#xff1a;2012版才刚用顺&#xff0c;怎么又来一个2025&#xff1f;别紧张。这个新版的标准不是要推翻你已经养成的安全编码习惯&#xff0c;而是把最近十年C语言生态的变化正式纳入约束框架&am…

作者头像 李华
网站建设 2026/9/11 22:18:32

2026年工时统计系统选型指南与实施策略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 22:18:19

HTML iframe 标签全面解析:原理、属性、实战场景与最佳实践

一、前言&#xff1a;不是过时标签&#xff0c;是嵌入式场景的原生方案 在前端组件化、微前端盛行的今天&#xff0c;很多人觉得 iframe 是老旧、过时的标签&#xff0c;甚至谈 iframe 色变。但事实上&#xff0c;iframe 是 HTML 原生支持的独立浏览上下文嵌入方案&#xff0c;…

作者头像 李华