--no-plugins 会跳过所有插件(项目、全局、声明未安装的),仅影响 PluginInterface 钩子,不影响内置逻辑和 vendor/bin 工具;参数须紧接子命令后,否则失效或被忽略。

加了 --no-plugins,composer update 就真的不跑任何插件了——不是“禁用功能”,是跳过整个插件生命周期。
为什么 composer update --no-plugins 有时像没生效?
最常见原因是参数位置错了。Composer 解析参数时,--no-plugins 必须紧接在子命令之后、其他选项之前:
- ✅ 正确:
composer update --no-plugins --with-dependencies - ❌ 错误:
composer update --with-dependencies --no-plugins(旧版 Composer 可能静默忽略) - ❌ 错误:
composer --no-plugins update(等价于composer --help)
另一个高发场景:你执行的其实不是 composer 二进制本身,而是 alias(如 alias c='composer')、wrapper 脚本(如 bin/composer)或 symlink 到全局 composer 的文件,导致参数未透传。验证方式:composer --version 和 composer update --no-plugins --help | head -3 看输出是否含 --no-plugins 字样。
composer update --no-plugins 会跳过哪些插件?
它一视同仁,跳过所有来源的插件:
- 项目
vendor/下已安装的(如phpstan/extension-installer) - 全局安装的(
~/.composer/vendor/下的) - 通过
extra.plugins声明但尚未 require 的
关键点:--no-plugins 不影响 vendor/bin/ 下的可执行文件(如 php-cs-fixer),它们不是插件;也不影响 Composer 内置逻辑(autoload、依赖解析、lock 文件生成),只停掉第三方通过 PluginInterface 注入的钩子。
禁用插件后,update 行为会怎么变?
不是“出错”,而是部分功能回退到原始状态,属于设计预期:
-
hirak/prestissimo被跳过 → 下载变串行,update明显变慢 -
symfony/flex被跳过 → recipes 不执行,config/目录不自动生成 -
dealerdirect/phpcodesniffer-composer-installer被跳过 → PHPCS 规则不会自动注册,后续phpcbf可能报错 - 某些私有 installer 插件被跳过 → 可能卡在 “Could not parse version constraint” 或直接报下载失败
注意:--no-plugins 不删 vendor/,不改 composer.json,也不动 composer.lock —— 它只是这次不加载。
只想禁用某一个插件,--no-plugins 不行怎么办?
命令行层面没有 --disable-plugin=xxx 这种开关。可行路径只有三条:
- 在
composer.json的extra.disabled-plugins中写全包名(大小写敏感,需 Composer ≥2.2):{ "extra": { "disabled-plugins": ["phpstan/extension-installer"] } } - 临时重命名
vendor/phpstan/extension-installer为vendor/phpstan/extension-installer.disabled,再运行composer dump-autoload - 设环境变量
COMPOSER_NO_PLUGINS=1(效果等同--no-plugins,但更隐蔽,CI 中易漏)
真正容易被忽略的是:插件一旦激活,就能 hook 到 update 全流程——包括修改依赖图、拦截包下载、注入 autoload 条目。所以 CI 脚本里每条 composer update 都该显式带上 --no-plugins,别依赖“默认干净”。


















