composer 2.2+ 默认禁用第三方插件以提升安全性,需在项目 composer.json 的 config.allow-plugins 中显式声明白名单;键名必须与插件包 name 字段完全一致(如 "phpstan/extension-installer": true),且不支持全局配置。

为什么 composer install 会跳过插件或报 Plugin installation failed
因为 Composer 从 2.2 版本起默认禁用所有第三方插件,除非明确列入白名单。这不是 bug,是安全策略升级——防止恶意插件通过依赖链静默执行代码。你看到插件没加载、composer dump-autoload 不生效、甚至某些包(如 phpstan/extension-installer)提示“not installed”,大概率是卡在白名单校验环节。
如何在 composer.json 中声明插件白名单
必须在项目根目录的 composer.json 顶层添加 config.allow-plugins 字段,值为布尔或对象。不支持在全局配置(~/.composer/config.json)中设置白名单,只认当前项目的配置。
- 允许全部插件(不推荐):
"config": { "allow-plugins": true } - 只允许可信插件(推荐):
"config": { "allow-plugins": { "phpstan/extension-installer": true, "dealerdirect/phpcodesniffer-composer-installer": true } } - 禁止特定插件(谨慎):
"phpunit/phpunit": false—— 这会覆盖插件自身声明的extra.plugin配置
注意:键名必须与插件包的 name 字段完全一致(包括 vendor 名),大小写敏感;设为 true 才代表允许,false 或缺失则拒绝。
哪些插件名容易填错
常见误填包括:漏掉 vendor 前缀(如写成 "extension-installer" 而非 "phpstan/extension-installer")、混淆包名与类名(如把 Composer\Installers 当作插件名)、或复制了 require 里的别名(如 "phpcs": "dealerdirect/phpcodesniffer-composer-installer" 中的 phpcs 不是插件名)。插件真实名称只能去其 composer.json 文件里查 "name" 字段。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
phpstan/extension-installer:用于自动加载 PHPStan 扩展 -
dealerdirect/phpcodesniffer-composer-installer:PHPCS 规则自动注册 -
hirak/prestissimo:已废弃,新版 Composer 内置并行下载,无需再配
运行 composer show --plugins 可列出当前已加载的插件及其完整包名,是最准的参考来源。
CI/CD 环境和团队协作要注意什么
白名单配置不会被 composer.lock 记录,所以每次 composer install 都会重新读取 composer.json 中的 allow-plugins。这意味着:
- CI 流水线失败?检查是否用了旧版 Composer(2.1 但 COMPOSER_VERSION=2.5.8
- 团队成员执行结果不同?确认没人本地改了全局 config 或用了
--no-plugins参数 - 依赖包自身带插件(如某些 Laravel 包)?必须把它的
name显式加入白名单,不能指望它“自动生效”
最易被忽略的是:子模块或 monorepo 场景下,每个子项目都要单独配白名单,父级 composer.json 的配置对子目录无效。










