composer无插件黑名单机制,仅支持allow-plugins白名单和--no-plugins临时禁用;{"*": false}等写法会被忽略,通配符不被支持,唯一可靠全禁方式是--no-plugins。

Composer 没有插件“黑名单”机制,只有白名单(allow-plugins)和临时禁用(--no-plugins)两种控制方式。试图用通配符或 "*": false 实现黑名单,实际会被忽略或导致配置无效。
为什么不能用 allow-plugins 做黑名单
Composer 的 allow-plugins 字段只接受三种值:true、false 或字符串数组。它不支持对象形式的键值对(如 {"*": false}),也不识别通配符、正则或排除语法:
-
"allow-plugins": {"*": false}—— 会被 Composer 忽略,等同于未设置,插件仍可能加载(取决于版本) -
"allow-plugins": ["!phpstan/extension-installer"]—— 语法错误,JSON 不合法,composer install直接失败 -
"allow-plugins": ["vendor/*"]—— 不支持通配符,该条目无效,Composer 不报错但也不生效
--no-plugins 是唯一可靠的“临时禁用全部”方案
当你需要跳过所有插件执行(例如排查 CI 失败、验证是否由插件引发冲突),--no-plugins 是最直接、最安全的方式:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 仅对当前命令生效,不影响
composer.json配置或后续操作 - 连
symfony/flex、phpstan/extension-installer这类官方插件也会被跳过 - 适合与
--no-scripts组合使用:composer install --no-plugins --no-scripts - 环境变量
COMPOSER_NO_PLUGINS=1效果等同,适合在 CI 脚本中统一控制
真正可控的“按需放行”必须靠 allow-plugins 白名单
从 Composer 2.2 起,未显式列入 allow-plugins 数组的插件,即使已安装,也完全不会加载——这不是警告,是静默拒绝:
- 插件名必须和
composer show输出的name完全一致,大小写敏感(如dealerdirect/phpcodesniffer-composer-installer,不是phpcodesniffer-composer-installer) - 必须写在
composer.json根级,不能放在config或extra下 - 如果用了
symfony/flex,就必须加进去,否则recipes不会自动执行 - CI 环境失败常见原因是:本地
composer update成功并生成了composer.lock,但新机器上没配allow-plugins,导致插件加载失败而中断
环境层面的安全加固比配置更关键
很多所谓“插件被禁用”的报错,其实根本不是配置问题,而是 PHP 环境缺失关键函数:
- 检查
proc_open是否被禁用:php -r "var_dump(function_exists('proc_open'));"→ 返回false就是它 - 某些插件依赖
pcntl_signal,尤其 Symfony 6.2+ 生态,缺失时会转为致命错误 - 插件声明的
composer-plugin-api版本与当前 Composer 不兼容(如插件写"^1.0",你用的是 Composer 2.x),composer diagnose --verbose末尾会明确提示 - 永远不要以
root运行composer install:Composer 2.4.2+ 会自动禁用插件,并可能拒绝执行
白名单配置写错一个字符、环境缺一个函数、CI 里少一行 --no-plugins,都可能导致整个流程卡住。这些点不在文档显眼位置,但几乎每个团队都会踩一次。










