--no-plugins 能禁用所有插件的加载与执行,但不移除插件声明或跳过插件API兼容性校验;它跳过事件钩子、自定义命令及插件扩展行为,而内置功能、scripts脚本和依赖安装仍正常运行。

什么是 --no-plugins,它真能禁用所有插件?
--no-plugins 是 Composer 提供的一个运行时开关,作用是跳过所有已安装的插件(包括全局和项目级),不加载、不执行它们的事件监听器和命令扩展。但它不禁止插件本身被声明在 composer.json 中,也不影响插件的自动发现逻辑——只是让 Composer 主流程完全忽略它们。
常见误判场景:你怀疑某个插件导致 composer install 卡住或报错,但加了 --no-plugins 后问题依旧存在,说明问题可能出在 Composer 自身、PHP 环境、网络代理或 composer.json 语法上,而非插件干扰。
怎么确认插件是否真的被绕过了?
最直接的方式是结合 -v(verbose)输出观察插件加载行为:
composer install -v --no-plugins
对比不带 --no-plugins 的输出,你会看到类似这样的差异:
- 有插件时:
Loading plugin xyz/abc (1.2.3)或Running plugin command...类日志 - 加
--no-plugins后:这类日志彻底消失,且PluginManager::load()不会被调用
注意:--no-plugins 对 composer global 命令也生效,但只影响当前命令上下文;它不会卸载或禁用插件配置本身。
哪些插件行为会被跳过?哪些不会?
被跳过的典型插件功能:
-
post-install-cmd、pre-update-cmd等事件钩子(如果由插件注册) - 自定义命令(如
composer normalize、composer check-platform-reqs) - 修改包下载源、重写
distURL、注入额外 autoloader 的行为
不会被跳过的部分:
- Composer 内置功能(如
autoload生成、依赖解析、锁文件更新)照常运行 - 项目
scripts中定义的脚本(如"post-install-cmd": "php artisan optimize")仍会执行——因为它们属于 composer.json 标准字段,不是插件机制 - 通过
require-dev引入的插件包本身仍会被安装(只要没被--no-install拦截),只是不激活
排查干扰时,--no-plugins 应该和谁一起用?
单独用 --no-plugins 往往不够,需组合其他开关缩小范围:
- 排除缓存干扰:
composer install --no-plugins --no-cache - 跳过 autoload 生成(加快测试):
composer install --no-plugins --no-autoloader - 强制重新解析依赖(忽略 lock):
composer update --no-plugins --lock - 验证是否为某特定插件引起:
composer global remove vendor/plugin-name(再试)
特别注意:--no-plugins 不能绕过 Composer 的 plugin-api 版本兼容检查。如果插件声明了不兼容的 composer-plugin-api 版本,即使加了 --no-plugins,Composer 在启动阶段仍可能报错退出——这是早期校验,发生在插件加载之前。










