--no-scripts仅跳过scripts钩子,不跳过autoloader生成、依赖解析及type语义处理;常用于ci/cd或容器构建中规避运行时缺失导致的脚本失败。

直接用 --no-scripts 就能跳过所有 scripts 钩子,但得清楚它不跳过 autoloader 生成、不绕过依赖解析,更不会忽略 composer.json 里定义的脚本类型本身。
什么时候必须加 --no-scripts
常见于 CI/CD 构建阶段或容器镜像构建时:比如你用 docker build 跑 composer install,但项目里写了 "post-install-cmd": "php artisan optimize"(Laravel),而容器里根本没装 Laravel 运行时依赖,一执行就报错中断。这时候加 --no-scripts 是最干脆的绕过方式。
- CI 环境缺少扩展(如
ext-pcntl)导致post-autoload-dump失败 - 部署目标机没装前端工具(
npm、webpack),但post-install-cmd里调了npm run build - 想快速验证依赖是否能正常下载解压,先屏蔽所有副作用
--no-scripts 和 --no-autoloader 别混用
--no-scripts 只禁用 scripts 段定义的钩子(pre-install-cmd、post-update-cmd 等),不影响自动加载器生成;而 --no-autoloader 会跳过 vendor/autoload.php 重建——这会导致后续 PHP 脚本无法 require 自动加载文件,通常不该单独用。
- 只跳脚本?用
composer install --no-scripts - 要跳脚本 + 不生成 autoload?用
composer install --no-scripts --no-autoloader(极少需要) - 误加
--no-autoloader后运行php index.php会直接报Fatal error: Uncaught Error: Class not found
它不能跳过哪些“看起来像脚本”的东西
--no-scripts 对以下情况完全无效:
-
composer.json里"type": "project"或"type": "library"的语义处理(这是 Composer 内部逻辑,不是 script) -
autoload配置引发的文件扫描和映射生成(这部分在--no-scripts下照常运行) - 插件(plugin)自身注册的事件监听器——比如
hirak/prestissimo插件加速下载,不受影响 - 错误信息如
[RuntimeException] Script php artisan migrate handling the post-update-cmd event returned with error code 1,加了--no-scripts就不会出现这行
真正容易被忽略的是:某些项目把关键初始化逻辑塞进 post-root-package-install,比如自动生成配置文件或检查环境变量。这种情况下,--no-scripts 虽然让命令跑通了,但后续运行时可能直接炸——得去翻 composer.json 的 scripts 段确认有没有这类隐性依赖。










