需禁用 Composer 插件时用 --no-plugins,如插件干扰依赖解析、卡在钩子或 CI 中需排除副作用;跳过 scripts 用 --no-scripts,如避免重型脚本掩盖 autoload 错误;二者可叠加用于纯净调试,且自 Composer 2.2+ 起默认禁用全局插件。

什么时候需要禁用 Composer 插件?
当你怀疑某个 composer-plugin 干扰了依赖解析、修改了包安装行为,或在 CI 环境中想排除插件副作用时,必须用 --no-plugins。典型场景包括:
- 执行
composer install时卡在某个插件钩子(如pre-install-cmd),而你只想验证原始依赖图是否能正常拉取 - 调试第三方包(如
laravel/framework)的 autoload 或 classmap 生成问题,但项目里装了hirak/prestissimo或roave/security-advisories这类深度介入安装流程的插件 - 在容器构建阶段,希望跳过所有插件以加速安装并确保可重现性——尤其当插件依赖外部服务(如私有 repo token 验证)时
什么时候该跳过 scripts 执行?
--no-scripts 的核心作用是绕过 composer.json 中定义的 scripts 段所有钩子,比如 post-install-cmd、pre-autoload-dump。常见使用时机:
- 本地开发时反复重装依赖,但不想每次都被
php artisan optimize:clear或npm run build拖慢流程 - 调试
autoload问题(例如类找不到),而项目里配置了"post-autoload-dump": "php ./vendor/bin/deptrac --config=deptrac.yaml"这类重型脚本,它可能掩盖真实 autoload 错误 - CI 流水线中分阶段执行:先
composer install --no-scripts,再单独跑composer run-script build,便于失败定位和缓存复用
--no-plugins 和 --no-scripts 能一起用吗?
完全可以,而且「纯净安装调试」场景下强烈建议同时启用:
composer install --no-plugins --no-scripts
二者叠加后,Composer 将:
- 不加载任何
PluginInterface实现(包括全局插件和项目内 require 的插件) - 完全忽略
composer.json的scripts字段,连dump-autoload这类内置命令绑定的钩子也不触发 - 只做最基础的依赖解包、文件复制、autoload 生成(除非显式加
--no-autoloader)
注意:--no-scripts 不影响 autoload 本身的生成逻辑,但会跳过所有 post-autoload-dump 类脚本;而 --no-plugins 可能导致某些插件提供的 autoload 优化(如 classmap 增量更新)失效。
容易被忽略的兼容性细节
这两个参数对不同 Composer 版本的行为略有差异:
- Composer 2.2+ 开始,
--no-plugins默认禁用全局插件,但旧版本需配合--no-global-plugins显式关闭 -
--no-scripts在composer create-project中默认启用,但很多人没意识到这点,导致新建项目时漏掉关键初始化脚本(如 Laravel 的php artisan key:generate) - 某些插件(如
symfony/flex)本质是“脚本驱动型”,它注册的post-install-cmd实际承担了核心功能;此时仅加--no-scripts不够,必须加--no-plugins才真正禁用 Flex 行为
调试时若发现行为异常,优先检查 composer show --plugins 输出,确认插件是否真被绕过——有时候插件已通过 composer global require 安装,却忘了在当前项目中禁用。










