Plugin was skipped警告出现是因为Composer 2.2+默认跳过未在项目根composer.json中显式require或require-dev声明的插件,以提升安全性;需检查插件是否直接声明、autoload配置是否正确,或临时禁用plugin-discovery(不推荐)。

为什么Plugin was skipped警告总在更新时出现
这个警告不是错误,但说明 Composer 没有加载你项目中声明的插件(比如 composer/installers、phpstan/extension-installer 或自定义插件),通常是因为插件未满足启用条件。最常见原因是:插件包未被当前项目的 require 或 require-dev 显式声明,却出现在 composer.json 的 extra 或通过其他依赖间接引入 —— Composer 2.2+ 默认跳过“未直接依赖”的插件,以提升安全性和可预测性。
检查插件是否被正确 require 到当前项目
运行 composer show --plugins 查看已激活插件列表;如果目标插件不在其中,大概率是它只存在于某个依赖包的 composer.json 里,而非你项目根目录的 composer.json 中。
- 打开你的项目根
composer.json,确认插件包(如dealerdirect/phpcodesniffer-composer-installer)出现在require或require-dev字段中 - 如果只是被某个依赖“带进来”,比如 A 包 require 了 B 插件,但你没直接 require B —— 那么 B 就会被跳过。此时必须手动加进去:
"require-dev": { "phpstan/extension-installer": "^1.3" } - 执行
composer update phpstan/extension-installer(或对应插件名),而不是全量update,避免意外升级其他包
插件类名或 autoload 配置不匹配导致跳过
即使插件被正确 require,Composer 仍可能因无法实例化插件类而跳过它。典型表现是警告末尾附带类似 Class "SomePlugin" not found 的提示。
- 检查插件包的
composer.json是否包含正确的autoload和extra.installer-paths(如适用) - 确认插件主类路径与
autoload中的 PSR-4 映射一致,例如:"autoload": { "psr-4": { "PhpStan\ExtensionInstaller\": "src/" } }对应类PhpStanExtensionInstallerInstaller - 运行
composer dump-autoload -o强制刷新自动加载映射,再试一次install或update
禁用插件跳过机制(仅限可信环境)
极少数情况,比如你完全信任所有依赖且需要兼容旧工作流,可以临时关闭跳过逻辑。但这会削弱 Composer 的安全默认行为,不建议长期开启。
- 在项目根目录执行:
composer config plugin-discovery false
这会写入composer.json的config.plugin-discovery为false - 注意:该配置对子依赖中的插件也生效,可能引发不可预期的副作用(如两个插件争抢同一事件)
- CI 环境中尤其要避免,因为不同机器上依赖解析顺序可能不同,导致行为不一致
真正稳定的解法永远是显式声明 + 正确 autoload,而不是绕过校验。插件跳过警告本身是 Composer 在提醒你:“这个扩展我没敢动——因为你没明确说要它”。


















