用 –no-scripts 参数可跳过所有脚本(如 post-install-cmd),避免断网时卡住;它不触发任何 scripts 钩子,但也会跳过 dump-autoload,需手动补运行。

composer install 时脚本卡住,断网环境下怎么跳过?
断网时 composer install 会因脚本(比如 post-install-cmd)尝试访问网络(如调用 git、curl 或第三方 API)而阻塞或报错。默认不跳过——它根本不管有没有网,照跑不误。
核心解法是用 --no-scripts 参数,它直接禁用所有脚本钩子,包括 pre-install-cmd、post-install-cmd 等。不是“跳过失败的”,而是“压根不触发”。
-
composer install --no-scripts:最常用,适合本地离线装依赖,且你确认不需要脚本做后续处理(比如生成 autoload、清缓存、构建前端资源) - 如果只是想跳过某类脚本,不能按类型过滤,
--no-scripts是唯一开关;没有--skip-post-install这种细粒度参数 - 注意:它也跳过
dump-autoload,所以执行后可能要手动补一句composer dump-autoload --optimize(如果项目依赖自动加载)
为什么 –no-plugins 不行?
--no-plugins 看起来像“关插件”,但实际只禁用 Composer 插件(即 composer-plugin 类型包),不影响 scripts 配置里定义的命令。很多人混淆这两者,结果加了 --no-plugins 还是卡在 post-install-cmd。
- 脚本(
scripts)写在composer.json的"scripts"字段里,是普通 shell/PHP 命令 - 插件(
plugins)是通过require-dev引入的、实现了ComposerPluginPluginInterface的包 - 断网问题几乎全出在脚本,不是插件;加
--no-plugins对解决卡住毫无帮助
CI/CD 或 docker 构建中如何安全绕过?
自动化环境常因网络策略(如内网无外网权限)导致脚本失败。这时候不能只靠 --no-scripts,得结合上下文判断是否真能跳过。
- 如果脚本只是生成前端资源(如
npm run build),而构建机已预装好node_modules,那--no-scripts安全 - 如果脚本含关键逻辑(如写配置文件、迁移数据库结构),跳过会导致环境不一致——此时应提前把脚本内容拆出,改由 CI 步骤显式执行,而非依赖 Composer 触发
- Docker 中建议在
composer install后立即运行必要脚本(如composer dump-autoload),避免把“是否跳过”逻辑散落在不同阶段
常见错误现象和对应检查点
看到这些提示,基本可以确定是脚本在联网失败:
-
Cloning into 'xxx'... fatal: unable to access 'https://...': Could not resolve host→ 脚本里用了git clone -
file_get_contents(https://...): failed to open stream→ PHP 脚本里硬编码了 HTTP 请求 - 长时间无输出,最后报
ProcessTimedOutException→ 脚本卡在 DNS 查询或连接等待 - 检查
composer.json的"scripts"字段,逐条看是否有curl、wget、git、php -r "file_get_contents(...)"等操作
真正麻烦的不是跳过脚本,而是有些脚本被当成“理所当然的初始化步骤”,跳过之后才发现 autoload 没刷、env 文件没生成、前端 bundle 缺失——这些得靠人去翻 scripts 内容,没法靠参数自动兜底。