composer 8.0+ 强制启用 allow-plugins 白名单机制,默认拒绝所有插件执行;需在 root composer.json 顶层以对象形式精确声明插件名(如 "phpstan/extension-installer": true),子依赖配置无效,填错或遗漏将导致插件静默失效。

allow-plugins 是 Composer 8.0+ 的强制安全开关
从 Composer 8.0 开始,allow-plugins 不再是可选项,而是默认拒绝所有插件执行——除非你明确放行。不配置它,很多依赖安装会直接失败,报错类似:Plugin installation is disabled. You must explicitly enable plugins in your composer.json.
它的作用不是“启用插件功能”,而是“白名单制授权”:没列进去的插件,哪怕 composer install 时自动下载了,也完全不会被加载或运行。
- 只对 root package(即你当前项目的
composer.json)生效,子依赖里的allow-plugins被忽略 - 值为
true表示允许全部(不推荐),false表示禁止全部(等同于不设),数组则表示精确白名单 - 插件名必须和其
composer.json中的name字段完全一致(比如phpstan/extension-installer,不能写成phpstan-extension-installer)
怎么在 composer.json 里正确声明 allow-plugins
直接写在 root composer.json 的最外层(和 require、autoload 同级),不要嵌套:
{
"require": {
"phpunit/phpunit": "^10.0",
"phpstan/extension-installer": "^1.3"
},
"allow-plugins": {
"phpstan/extension-installer": true,
"dealerdirect/phpcodesniffer-composer-installer": true
}
}
注意:allow-plugins 是对象(key-value),不是数组。键是插件包名,值只能是 true 或 false(false 表示显式禁止,哪怕它出现在 require 里)。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 别写成
"allow-plugins": ["phpstan/extension-installer"]—— 这是旧版语法,Composer 8+ 会报错Invalid value for allow-plugins, expected object - 如果某个插件你暂时不用但又不想删掉依赖,可以设为
false,它仍会被安装,但不会激活 - 全局配置(
COMPOSER_HOME/config.json)里的allow-plugins仅影响全局命令,不影响项目内执行
哪些插件名容易填错?查法比猜快
插件名不是随便起的,它来自插件包自己的 composer.json。填错就等于没授权,插件静默失效——你可能根本意识不到它没跑。
- 最稳的方式:进
vendor/插件包名/目录,打开它的composer.json,找"name"字段(比如roave/security-advisories的 name 就是它自己,但phpstan/extension-installer的 name 也是它自己) - 别依赖 packagist 页面显示的“Vendor Name”,要看源码;有些包用下划线(
myvendor_myplugin),有些用短横(myvendor-myplugin),差一个字符就不匹配 - 常见陷阱名:
symfony/flex(不是symfony-flex)、ocramius/proxy-manager(不是proxy-manager)、phpstan/phpstan本身不是插件,phpstan/extension-installer才是
CI/CD 和团队协作时最容易漏掉的点
本地 composer install 成功,不代表 CI 也能过。因为 allow-plugins 配置一旦缺失或写错,错误只在插件实际被触发时才暴露——比如第一次跑 phpstan analyse 才发现扩展没装上。
- 检查
composer.json是否提交了allow-plugins段,尤其注意 Git 忽略了它(比如误加到.gitignore) - Docker 构建时,如果用了
--no-plugins参数,allow-plugins配置会被绕过,插件全禁——这个参数优先级更高 - 某些 IDE 插件或部署脚本会重写
composer.json,覆盖掉allow-plugins,建议把它放在文件靠前位置,降低被挤到末尾后格式错乱的风险
插件授权不是“设一次就完事”的配置,它是随依赖演进持续维护的清单。每次新增一个带插件行为的包(比如加了 php-cs-fixer 或 infection/infection),都得同步确认它是否在 allow-plugins 里登记。










