Composer install卡在git clone是因为默认对vcs包优先走git clone,服务器无Git时直接报错而非fallback;必须加--prefer-dist强制用ZIP包绕过Git操作,并配合--no-dev、--no-scripts等参数确保稳定执行。

为什么 composer install 会卡在 git clone
因为 Composer 默认对 vcs 类型的包(比如 "type": "git" 或分支版本如 dev-main)优先走 git clone,而不是下载 ZIP 包。服务器没装 Git 时,它不会自动 fallback,而是直接报错:sh: git: not found 或卡在 Cloning into '' —— 这不是网络问题,是命令缺失。
必须加 --prefer-dist 参数
--prefer-dist 强制 Composer 只用预编译的 ZIP/TAR 包(dist),完全绕过 Git 操作。这是无 Git 环境下能跑通的硬性前提。
- 不加这个参数,哪怕锁文件里全是稳定版(如
2.12.0),只要某个依赖在composer.lock中记录为source类型,就会失败 -
--prefer-dist不影响功能,只改变获取方式:从 GitHub/GitLab 的/archive/下载 ZIP,而非克隆仓库 - 注意:它不能解决私有 Git 仓库的问题——那些必须配 SSH/HTTPS 认证,且仍需 Git 命令支持
配套参数一个都不能少
光加 --prefer-dist 不够,还得组合其他关键开关:
-
--no-dev:跳过 require-dev,避免拉取 PHPUnit、PHPStan 等本就不该进生产环境的包 -
--no-scripts:禁用post-install-cmd等钩子,防止某些包试图调用git或npm -
--no-plugins:禁用插件(如hirak/prestissimo),有些插件内部会偷偷执行 Git 命令 -
--no-interaction:避免卡在私有包认证提示上(比如输入 token)
完整命令示例:COMPOSER_DISABLE_NETWORK=1 composer install --prefer-dist --no-dev --no-scripts --no-plugins --no-interaction(COMPOSER_DISABLE_NETWORK=1 防止 DNS 查询,尤其在内网或离线环境)
提前确认 lock 文件是否含 source 条目
打开 composer.lock,搜索 "type": "source"。如果存在,说明至少有一个包被锁定为源码模式,--prefer-dist 也救不了你——必须回到构建机重新生成 lock 文件,确保所有包都走 dist。
- 构建机上运行:
composer update --lock --prefer-dist,再提交新 lock 文件 - 或者更稳妥:在 CI 中固定 PHP 版本 + 扩展,用
composer install --prefer-dist生成 vendor 后打包,部署时只同步代码和 vendor 目录 - 别指望
--ignore-platform-reqs解决这个问题,它管的是扩展和 PHP 版本,不是源类型
真正麻烦的从来不是“没 Git”,而是 lock 文件里混进了不该有的 source 记录,又没人检查。


















