Composer报“git: command not found”是因为触发source模式(如require dev分支、vcs仓库、minimum-stability为dev等),必须调用系统git;解决需确保--prefer-dist生效——依赖包提供dist字段、镜像启用archive构建、私有包显式配置dist.url,否则仍fallback失败。

必须用 composer install --no-dev --prefer-dist,且确保 composer.lock 已存在并提交。任何触发 source 模式的配置或依赖写法,都会让 Composer 在无 Git 时直接失败。
为什么 composer install 会报错“git: command not found”
不是服务器缺 Git,而是 Composer 主动调用了它——常见诱因包括:
-
require中写了"dev-main"、"dev-develop"这类开发分支版本 -
repositories里定义了"type": "vcs"(如指向 GitHub 私有库) -
composer.json含"minimum-stability": "dev",又没显式锁死稳定版 - 环境变量设了
COMPOSER_PREFER_SOURCE=1,或命令行加了--prefer-source
只要触发其中一条,Composer 就会跳过 dist,硬切到 git clone,此时报错纯属意料之中。
--prefer-dist 不生效的三个真实原因
加了参数却仍看到 Cloning 日志?说明它被绕过了。真正卡点在:
- 私有包在
composer.json中只写了裸引用(如"vendor/private": "dev-main"),没显式声明dist字段 - 包本身没提供
dist.url(查composer show vendor/package -v输出,若无dist:行,Composer 只能 fallback) - 镜像服务(如 Satis)没启用 archive 构建,配置里缺
"archive": {"format": "zip"}
验证是否真走 dist:加 -vvv 参数运行,看到 Downloading https://... 才算成功;若仍有 Executing command (CWD): git clone,说明某处强制 source。
私有包必须手动声明 dist 才能离线安装
默认拉取私有 Git 包走 source,离线时完全不可行。唯一可行路径是预打包 ZIP 并显式配置:
-
url必须指向可离线访问的位置,如file:///mnt/nfs/dist/package-1.2.0.zip或内网 HTTP 地址 -
version必须是明确语义化版本(如"1.2.0"),不能写"dev-main"或"*",否则解析失败 - 删掉
"source"字段(哪怕为空),否则 Composer 会优先 fallback 到它并失败 - ZIP 根目录必须干净,不带仓库名前缀,否则
autoload路径会失效
示例片段中 "dist": {"url": "...", "type": "zip"} 是硬性要求,不是可选项。
离线部署最稳的底线操作
别赌缓存、别信镜像、别省 vendor 目录——最可靠的是:
- 在联网机器上,用和目标服务器**完全一致的 PHP 版本、扩展(尤其是
ext-zip、ext-openssl)、架构**执行composer install --no-dev --prefer-dist - 确认
vendor/autoload.php可正常require,再把整个vendor/+composer.lock打包带走 - 目标机解压后,运行
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader,最后补composer dump-autoload -o
漏掉 PHP 版本或扩展一致性,哈希校验就会失败;没禁用网络,Composer 仍会尝试访问 packagist.org 并退出。


















