composer install --no-plugins 会彻底跳过所有插件加载与执行,包括 plugininterface::activate(),适用于 ci 构建或调试;它不影响 vendor/bin 下的普通可执行工具,仅禁用实现 plugininterface 的 composer 插件。

composer install 时跳过所有插件执行
直接加 --no-plugins 就行,它会彻底绕过插件的加载和运行,连 PluginInterface 的 activate() 都不会触发。
典型场景是:CI 构建时想排除插件副作用(比如自动修改 autoload、发 HTTP 请求、写临时文件),或调试时确认问题是否由某个插件引起。
-
--no-plugins是全局开关,对install、update、require都生效 - 它不区分插件来源(composer.json 的
require或全局安装),一并禁用 - 不会报错,也不会提示“已跳过插件”,安静地跳过——这点容易误以为插件没生效其实是被禁了
为什么 vendor/bin 目录下的插件命令还能运行?
--no-plugins 只影响 Composer 自身生命周期中的插件钩子(如 pre-autoload-dump),不影响已安装到 vendor/bin 的可执行脚本。
比如你装了 phpstan/phpstan,它的 phpstan 命令仍在 vendor/bin/phpstan,照常能跑——因为它不是 Composer 插件,只是个普通依赖。
- 真正在意的是“Composer 插件”:即实现了
Composer\Plugin\PluginInterface的包(如hirak/prestissimo、dealerdirect/phpcodesniffer-composer-installer) - 这些插件注册的事件监听器,在
--no-plugins下完全不注册,相当于不存在 - 别混淆“插件”和“带 bin 的工具包”,后者不受影响
禁用特定插件而不是全部?
Composer 没提供 --disable-plugin=xxx 这种粒度的开关,只有全开或全关。
如果只想停掉某一个,得临时改配置:
- 删掉
composer.json里该插件的require条目,再composer update - 或者用
COMPOSER_NO_PLUGINS=1环境变量替代命令行参数,效果一样但更易在 CI 中统一控制 - 注意:某些插件(如
symfony/flex)深度集成进安装流程,禁用后可能导致recipes不执行、config/文件不生成——这不是 bug,是设计使然
常见错误现象:明明加了 --no-plugins,插件行为还在
最可能的原因是:你执行的不是 Composer 命令本身,而是被包装过的脚本。
- 比如用
./vendor/bin/composer install,但这个文件其实是 symlink 到全局 composer,而你实际运行的是系统 PATH 里的那个——参数没传过去 - 检查是否用了 alias(如
alias c='composer'),shell alias 有时会吃掉参数 - 运行
composer --version && echo $?验证当前命令确实是 Composer;再试composer install --no-plugins --help | head -5,看输出里有没有 “--no-plugins” 字样 - 某些 IDE(如 PHPStorm)内置的 Composer 工具默认不透传这个参数,得手动改 Runner 设置
真正要起效,--no-plugins 必须紧贴 composer 可执行文件调用,且不能被中间层截断。插件机制本身是 Composer 启动早期就决定的,错过那一步,后面怎么补都晚了。










