composer install --no-plugins 会跳过所有已声明的插件,不加载、不执行其 activate() 或事件钩子,是排查依赖安装异常、命令卡死、钩子报错的最有效手段之一。

直接结论: composer install --no-plugins 会跳过所有已声明的插件(包括 composer-plugin-api 兼容的包),不加载、不执行其 activate() 或事件钩子,是排查依赖安装异常、命令卡死、钩子报错的最有效手段之一。
什么时候必须加 --no-plugins
当你遇到以下任一现象,且怀疑与插件有关时,应优先尝试:
-
composer install卡在Loading plugin ...或某条Executing command ...不再响应 - 安装后生成的
vendor/autoload.php无法正常加载类,但手动删掉插件相关目录后恢复 - 报错信息里明确出现插件类名,例如
Class "SomeVendor\SomePlugin\Plugin" not found或Call to undefined method ... on null(插件提前崩溃) - CI 环境中安装成功,本地失败,而差异点恰好是某个全局插件(如
hirak/prestissimo或phpstan/extension-installer)
--no-plugins 对哪些插件生效?
它禁用的是所有通过 composer.json 的 "type": "composer-plugin" 声明,并在 require 或 require-dev 中引入的插件。包括:
- 项目级插件(如
phpstan/extension-installer、symfony/flex) - 全局插件(如果当前命令走的是全局 Composer 配置,且插件被启用)
- 第三方 installer(如
ocramius/package-versions的旧版 hook)
但它不禁止:composer.json 中 "scripts" 定义的自定义命令(那些仍会运行),也不影响 autoload 自动加载逻辑本身——只是插件注册的额外 autoload 规则不会生效。
实操建议:分步验证是否插件导致问题
别一上来就删 composer.lock 或重装整个 vendor。按顺序做:
- 先运行
composer install --no-plugins --dry-run
看是否能顺利解析依赖图,无报错即说明插件干扰了依赖解析阶段 - 再运行
composer install --no-plugins
,观察是否能完成安装;若成功,说明问题出在某个插件的post-install-cmd或pre-autoload-dump钩子上 - 定位具体插件:临时注释
composer.json中require下疑似插件的条目(如"symfony/flex": "^2.0"),再普通 install,逐步排除 - 注意:某些插件(如 Flex)会修改
composer.json自身,禁用后可能缺失配置项,此时需检查symfony.lock或项目根目录下新增/变更的文件
容易忽略的副作用
--no-plugins 不是“安全模式”,它会让一些本该自动完成的动作失效:
-
symfony/flex不工作 →config/目录不会自动创建,bundle 配置不写入config/bundles.php -
phpstan/extension-installer不工作 → PHPStan 扩展不会自动注册到phpstan.neon -
ocramius/package-versions(v1.x)不工作 →PackageVersions\Versions类不可用,可能导致依赖它的库(如 Doctrine ORM)启动失败
所以禁用只是诊断手段,不能长期用于生产部署;确认问题后,应升级插件、调整其配置,或在 composer.json 中显式设置 "extra" 选项来关闭特定行为,而不是全局禁用。










