--no-scripts能应急是因为它跳过所有scripts钩子,只完成依赖下载、解包和autoload生成,不执行易失败的post-install-cmd等命令,确保vendor目录完整安装。

脚本执行失败时,composer install 会直接中断,不加干预就卡住——这时候加 --no-scripts 是最快绕过问题、完成依赖安装的方法。
为什么 --no-scripts 能应急?
Composer 的 scripts(比如 post-install-cmd)默认在安装完成后自动触发。一旦某个脚本报错(如 php artisan optimize 找不到命令、npm run build 缺少 Node 环境),整个安装流程就会终止,连 vendor/ 都可能没下全。
--no-scripts 的作用很直接:跳过所有 scripts 段定义的钩子,只做最核心的事——解包、下载、写 autoload、生成 vendor/autoload.php。
- 它不影响依赖解析和文件下载,
composer.lock仍被严格遵循 - 不会修改
composer.json或重写锁文件 - 适合 CI 构建、本地快速恢复、或排查脚本本身问题时使用
哪些场景下必须用 --no-scripts?
常见于开发环境未配齐、CI 环境缺失前置工具、或项目脚本有硬依赖但尚未满足时:
Script php artisan package:discover handling the post-autoload-dump event returned with error code 1-
sh: 1: npm: not found(但你只想先装 PHP 包) - 本地没装 Laravel Mix,却在
post-install-cmd里写了npm run production - 脚本中调用了尚未生成的二进制(如
./vendor/bin/phpunit在第一次安装时还不存在)
--no-scripts 后要手动补什么?
跳过脚本 ≠ 万事大吉。有些步骤是后续运行必需的,得自己补上:
- 如果项目依赖自动发现(如 Laravel 的
package:discover),需手动运行:php artisan package:discover --ansi - 若用了
composer dump-autoload -o优化,现在得补:composer dump-autoload -o - 前端资源构建(
npm install && npm run build)得单独执行,且要确认 Node 版本和package.json存在 - 某些包的安装后初始化(如
phpstan analyse配置生成)也要人工触发
别把它当长期方案
--no-scripts 是断点续传的扳手,不是新流程。长期禁用会导致:
- 每次部署都要手动补漏,容易遗漏关键初始化
- CI 流程不可复现(本地能跑,CI 加了
--no-scripts就出问题) - 掩盖真实问题:比如脚本失败其实是因
php.ini缺扩展、或vendor/bin不在$PATH
真正该做的,是定位哪个脚本失败、为什么失败,然后修复它——比如把 npm run build 移到 CI 的独立阶段,或给 php artisan 加 if [ -f artisan ]; then ... fi 守卫。











