--dry-run没用是因为它不加载插件、不触发activate()或版本校验,仅做sat依赖求解;真正验证需用composer update --no-plugins --dry-run -v定位问题源。

插件不兼容报错时,--dry-run 为什么没用
因为 --dry-run 根本不加载插件,也不触发插件的 activate() 或版本校验逻辑。它只做依赖图的 SAT 求解,跳过了整个插件生命周期。你看到“成功”,不代表真实 composer update 能过。
真正要模拟安装流程,得加 --no-plugins 显式排除干扰:
-
composer update --no-plugins --dry-run -v:如果这步失败,问题在包本身;如果通过,基本锁定是插件导致 - 再试
composer update --no-plugins看是否真能装通——这是验证插件是否为唯一阻塞点的最简方式
绕过插件校验的两种安全边界
不是所有插件都能或应该被绕过。关键看它是“平台级约束”还是“功能级钩子”:
- 属于
composer-plugin-api的基础设施类插件(如hirak/prestissimo,phpstan/extension-installer),可临时禁用:composer update --no-plugins - 涉及自动加载、脚本注入、事件监听的插件(如
laravel-zero/installer),禁用后可能让vendor/autoload.php缺失类或命令不可用,不能只靠--no-plugins解决
此时更稳妥的做法是降级插件本身:composer require vendor/plugin:1.2.0 --update-with-dependencies,而非绕过它。
为什么回退 Composer 1.x 有时真管用
Composer 2.x 对插件 API 的校验更严格,尤其对 extra 字段解析、PluginInterface 实现和 composer-plugin-api 版本绑定。某些老插件只声明了 "composer-plugin-api": "^1.0",在 2.x 下直接被拒绝加载。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
验证方法:
- 运行
composer show vendor/plugin,看requires里是否含composer-plugin-api及其版本范围 - 查插件源码的
composer.json,确认它是否支持^2.0 - 若不支持,且无法升级插件,
composer self-update --1是合法回退路径(但仅限开发环境)
绕过插件 ≠ 绕过依赖冲突
常见误区:以为加了 --no-plugins 就能解决所有“版本冲突”。其实插件不参与依赖求解,它只在依赖安装完成后才被调用。如果你看到报错里有 Your requirements could not be resolved,那冲突一定出在包版本约束或平台要求上,跟插件无关。
区分信号很关键:
- 报错含
Plugin installation failed或class not found in Plugin→ 插件层问题 - 报错含
monolog/monolog: ^2.0 conflicts with monolog/monolog: 1.27.0→ 纯依赖树问题,插件禁不禁都一样
插件只是执行阶段的参与者,不是约束阶段的决策者。混淆这两层,排查方向就全偏了。










