--no-scripts 仅跳过 composer.json 中 scripts 定义的自定义脚本(如 post-install-cmd、pre-autoload-dump 及第三方包的 post-package-install),不跳过自动加载生成、插件激活、依赖检查、平台校验等核心流程。

composer install --no-scripts 确实能跳过脚本事件执行,但它只跳过 scripts 里定义的钩子,不碰自动加载生成、插件激活或依赖检查 —— 换句话说,它静默的是“人写的脚本”,不是 Composer 自己该干的活。
哪些脚本会被 --no-scripts 真正跳过
它只屏蔽 composer.json 中 "scripts" 下声明的事件回调,比如:
-
post-install-cmd、pre-autoload-dump这类标准事件 - 自定义脚本名(如
"build")—— 只要没被显式触发,也不会跑 - 第三方包在自己的
composer.json里写的post-package-install等(Composer 2.2+ 默认启用,但--no-scripts会一并压制)
哪些“看起来像脚本”的事它根本不管
别指望它让 Composer “变懒”:以下操作照常发生,且无法用这个参数绕过
-
vendor/autoload.php生成和优化(这是安装流程核心,不是脚本) - 插件(如
hirak/prestissimo)的PluginInterface::activate()仍会调用 - 依赖版本冲突检测、平台配置校验(如 PHP 版本、扩展缺失)依然报错,比如
Your requirements could not be resolved -
composer.lock文件校验失败时仍会中止,提示Lock file is not up to date
常见误用场景和坑
很多人加 --no-scripts 是为了“跳过报错”,结果发现根本没用 —— 因为错误压根不在脚本里
- 想跳过
php artisan optimize报错?✅ 有效(如果它在post-install-cmd里) - 想跳过
ext-mbstring missing导致安装失败?❌ 无效(这是平台检查,发生在脚本执行前) - CI 环境里加了
--no-scripts却发现phpstan还是跑了?可能它被注册在post-autoload-dump,但你用了--no-autoloader或缓存了旧 lock 文件,实际执行了另一套流程 - 本地
composer install正常,CI 加了--no-scripts反而失败?检查是否漏掉了某个脚本负责生成配置文件(如.env),跳过后后续命令直接读不到
真正需要“静默”的时候,得先分清:报错来自你自己写的脚本,还是 Composer 底层约束。后者只能修环境、调配置、改 platform,--no-scripts 帮不上忙。










