composer 报错 git not found 是因未安装 git 且依赖包需通过 git 克隆;加 --prefer-dist 可绕过,但要求包提供 dist 归档,否则仍 fallback 到 source。

Composer 报错 git not found 怎么办
直接结论:Composer 在默认行为下,只要包的 composer.json 指定了 "type": "vcs" 或源为 Git 仓库(比如 GitHub),且没显式要求用 dist,它就会尝试调用系统 git 命令 —— 此时若没装 git,就卡在 Cloning failed using an ssh command 或更直白的 sh: git: not found。
--prefer-dist 真的能绕过 git 吗
能,但有前提:目标包必须提供可用的 dist 归档(即 dist.zip 或 dist.tar.gz),且 Packagist 上已正确索引。Composer 不会“自动造 dist”,它只是跳过 clone 步骤,改从 dist.url 下载预打包文件。
- 绝大多数 Packagist 上的稳定版(tag)都带 dist,dev 分支通常不提供
- 私有包若用
composer-satis或toran proxy搭建,需确认是否启用了 dist 构建 - 如果包的
composer.json里写了"dist": {"url": "...", "type": "zip"},Composer 就认;否则 fallback 到 source
没 git 时强制走 dist 的实操配置
光加 --prefer-dist 参数不够稳,尤其在 CI/CD 或容器环境里。得从配置层堵死 source 回退路径:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 全局禁用 source:
composer config --global prefer-stable true+composer config --global github-protocols https(避免 SSH 触发 git) - 项目级锁定:
composer config prefer-dist true,写入本地composer.json的"config"段 - CI 场景推荐加
--no-plugins --no-scripts,防止某些插件偷偷调用git - 验证是否生效:运行
composer install -vvv,看到Downloading https://.../package-name.zip就对了;若仍有Executing command (CWD): git clone,说明某处 still forces source
私有包或自建源没 dist 的真实困境
很多内网 Satis/Toran 实例默认只同步 source,因为生成 dist 需额外 zip 步骤和存储空间。这时候 --prefer-dist 会静默 fallback 到 source,然后再次失败 —— 错误日志可能只显示 Failed to download vendor/package,根本不会提 git。
- 查证方式:
composer show vendor/package -v,看输出里dist字段是否存在且url可访问 - 修复动作:在 Satis 配置中加
"archive": {"format": "zip", "skip-dev": true},并重跑php bin/satis build - 临时救急:把包 fork 到 GitHub,打个 tag,Packagist 会自动抓 dist;或者手动上传 zip 到对象存储,改
composer.json的dist.url
最常被忽略的一点:Composer 的 dist 缓存(~/.composer/cache/files/)里如果存着旧的、不带 dist 信息的 composer.lock 记录,即使你改了配置,它也可能复用错误元数据 —— 遇到诡异 fallback,先删缓存再试。










