--no-plugins 是 ci/cd 和生产部署的硬性安全要求,因其彻底绕过 pluginmanager::loadplugins(),禁用所有插件加载与执行,防止恶意或不可信插件导致任意代码执行。

必须加 --no-plugins,否则 CI/CD 或生产部署中插件可能执行任意代码——这不是可选项,是安全底线。
为什么 --no-plugins 是硬性要求
Composer 插件在 install 或 update 时会自动加载并执行 PHP 代码,来源不限于 composer.json 的 require:它可能来自全局配置、项目 extra.plugins、甚至第三方包的 installer 声明。一旦插件被篡改或不可信,composer install 就等于直接运行远程代码。
加了 --no-plugins 后,Composer 完全跳过 PluginManager::loadPlugins() 流程,不扫描、不实例化、不触发任何插件生命周期方法——不是“禁用”,而是“彻底绕过”。
- CI 脚本里没加这个参数?等同于给所有 PR 开后门
- 用 Docker 构建时依赖镜像预装插件?必须显式禁用,不能靠“默认没装”侥幸
- 某些私有仓库认证插件(如自定义 token 注入)会在安装阶段调用 API,禁用后这类行为直接消失
--no-plugins 必须放在命令末尾前,且不能和 wrapper 冲突
参数顺序直接影响是否生效:Composer 解析时把 --no-plugins 当作早期开关,用于决定是否初始化插件系统。位置错就等于没加。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- ✅ 正确:
composer install --no-plugins --no-interaction --no-scripts - ❌ 错误:
composer install --no-interaction --no-plugins(旧版 Composer 可能静默忽略) - ❌ 错误:
composer --no-plugins install(等价于composer --help) - 若 CI 中用了封装脚本(如
bin/composer),要确认它没自动注入--plugins或覆盖环境变量
禁用插件后哪些功能会降级或失效
--no-plugins 不影响 scripts(如 post-install-cmd),只跳过插件注册。但很多常用功能依赖插件实现,禁用后会回退到基础行为:
-
hirak/prestissimo:并行下载失效 → 恢复串行下载,速度变慢但行为可预测 -
composer/installers:不再将 WordPress 插件装进wp-content/plugins/→ 全部回落到vendor/标准路径 - PHPStan / Psalm 扩展安装器:扩展不会自动注册 →
phpstan analyse可能报 “unknown rule” - 自定义 installer(如处理
.phar或私有协议):直接报错 “Could not parse version constraint”
注意:vendor/bin/ 下的可执行文件(如 php-cs-fixer)不受影响,它们不是插件,只是普通二进制。
别指望“只禁一个插件”,真要控制得从源头下手
Composer 没有 --disable-plugin=xxx 这种细粒度开关。所谓“只禁某个”,实际只有三条路:
- 在
composer.json的extra字段写:"disabled-plugins": ["vendor/package-name"](需 Composer ≥2.2) - 临时删掉
vendor/vendor-name/package-name目录(⚠️ 危险:破坏 autoload 和完整性校验,下次install可能失败) - 用环境变量
COMPOSER_NO_PLUGINS=1替代(效果等同--no-plugins,但更隐蔽,CI 日志里容易漏看)
真正关键的是意识到:插件一旦激活,就能 hook 到 install、update、dump-autoload 等几乎所有核心流程。所以 CI 中每条 Composer 命令都该显式带上 --no-plugins,而不是等出事再补。










