allow-plugins 是 composer 2.2+ 的强制安全开关,未配置则 composer install 直接报错;必须在 composer.json 根级声明小写完整包名数组,禁用通配符,生产环境须加 --no-plugins。

allow-plugins 不是可选配置,而是 Composer 2.2+ 的强制安全开关;没配就跑 composer install,直接报错中断。
为什么 composer install 会突然失败,提示 “Plugin not allowed”
Composer 2.2 起默认拒绝所有插件执行,哪怕 composer.lock 里记了 symfony/flex 或 phpstan/extension-installer,只要 composer.json 里没显式授权,安装时就会卡住并抛出类似错误:
Plugin installation failed: Package "symfony/flex" cannot be installed as it is not allowed by allow-plugins.
这不是网络或权限问题,是安全策略生效——它不看你本地有没有装过、也不管 lock 文件是否合法,只认 composer.json 根级的 allow-plugins 声明。
- 该配置必须写在
composer.json的**顶层**(和require同级),不是config下,也不是extra里 - 大小写敏感:
"Symfony/Flex"❌,"symfony/flex"✅ - 不支持通配符:
"*"、"vendor/*"、"*/flex"全部被忽略,只接受完整包名 - 全局
COMPOSER_HOME/config.json中的allow-plugins对项目内命令无效
如何正确声明 allow-plugins 数组
最安全的做法是从空数组起步,只加你真实依赖且已审计过的插件:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先确认项目是否真需要这个插件:比如
laravel/pint是 dev 工具,生产环境根本不用;symfony/flex若用 Symfony 6+,则必须加,否则 recipes 不执行 - 查 Packagist 页面,看是否有 Verified 标识、LICENSE 是否明确、GitHub stars ≥ 500 且近半年有活跃提交
- 运行
composer show vendor/name,确认输出含type: composer-plugin,再翻源码看是否调用exec()、eval()或写入vendor/外路径 - 在
composer.json顶层写成数组形式(推荐)而非对象形式,避免 JSON 解析歧义:
{
"name": "my/app",
"allow-plugins": [
"symfony/flex",
"phpstan/extension-installer",
"dealerdirect/phpcodesniffer-composer-installer"
],
"require": { ... }
}
别写 "allow-plugins": true——这等于关掉全部防护,把构建期控制权交给任意 transitive 依赖。
CI/CD 和生产环境必须加 --no-plugins
--no-plugins 不是“建议开启”,而是硬性要求。它必须出现在命令末尾:
-
composer install --no-plugins --no-scripts --no-dev --prefer-dist✅ -
composer --no-plugins install❌(等价于composer --help)
它不会跳过依赖下载或 autoloader 生成,只切断插件代码执行链。即使你已在 allow-plugins 列表中授权了所有插件,生产部署也应强制加上 —— 因为插件行为可能随版本更新而变更,而 --no-plugins 是唯一稳定、可审计的兜底手段。
最容易被忽略的是:allow-plugins 只管“谁可以注册”,不管“注册后做什么”;一个插件是否调用外部命令、修改 autoload 或污染 vendor/,得靠人工审计源码,不能只信包名。










