composer 在无 git 时仍强制调用 git clone 的根本原因是配置或依赖声明触发了 source 模式,而非 git 不可用;常见触发条件包括使用 dev 分支、vcs 类型仓库、minimum-stability=dev 或启用 --prefer-source。

不是 Git 本身连不上,而是 Composer 在没 Git 的前提下,仍试图调用它去拉源码——根本矛盾点在于“该不该用 Git”,而不是“Git 能不能用”。
为什么 composer install 会坚持找 Git
Composer 默认行为是:遇到以下任一情况,就放弃 ZIP 包,硬切到 git clone:
-
require里写了"dev-main"、"dev-develop"这类开发分支版本 -
repositories中定义了"type": "vcs"(比如指向 GitHub 私有库) - 项目根目录
composer.json含"minimum-stability": "dev",且没显式锁死稳定版 - 你或 CI 脚本主动加了
--prefer-source或设置了COMPOSER_PREFER_SOURCE=1
只要触发其中一条,Composer 就会忽略 dist 存在与否,直接执行 git clone —— 此时系统没 git 命令,报错就毫无悬念。
composer install --prefer-dist 不生效的常见原因
加了 --prefer-dist 却还是看到 Cloning 日志?说明它被绕过了。真实原因包括:
- 包本身没提供
dist字段:composer show vendor/package -v输出里没有dist.url,Composer 只能 fallback - 私有 Satis/Toran 镜像没启用
archive构建(配置缺"archive": {"format": "zip"}) -
repositories是type: "package"但手动写的distURL 返回 404 或不可访问 - CI 环境用了
--no-cache+--no-plugins,但某插件在pre-install-cmd钩子里偷偷调用了git
验证是否真走 dist:加 -vvv 参数运行,看到 Downloading https://.../package.zip 才算成功;若仍有 Executing command (CWD): git clone,说明某处强制 source。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
不装 Git 的硬性约束配置
光靠命令行参数不够稳,尤其在 Docker 或 CI 中。必须从配置层堵死 source 回退路径:
- 项目级锁定(写入本地
composer.json):composer config prefer-dist true - 禁用 VCS 协议降级:
composer config -g github-protocols https(避免 SSH 触发git) - 全局禁止 dev 分支拉取:
composer config -g minimum-stability stable(配合"prefer-stable": true) - Dockerfile 中加环境变量:
ENV COMPOSER_PREFER_DIST=1,比每次写参数更可靠
注意:prefer-dist 配置只影响下载方式,不改变版本解析逻辑——如果 require 写的是 "dev-main",即使设了 prefer-dist,Composer 仍会尝试 fetch 元数据,而元数据拉取失败时可能静默 fallback 到 source 并报错。
私有包没 dist 时的临时救急法
内网 Satis 实例默认不生成 dist,--prefer-dist 会静默失败,错误日志只显示 Failed to download,根本不会提 git。查证和修复步骤:
- 先确认:
composer show vendor/private-package -v | grep dist,无输出即无 dist - 检查 Satis 配置文件是否含
"archive": {"format": "zip", "skip-dev": true} - 重跑构建:
php bin/satis build satis.json web/(确保 zip 文件实际生成并可 HTTP 访问) - 救急替代方案:把私有库 fork 到 GitHub,打一个
v1.0.0tag,Packagist 会自动索引 dist;或手动上传 zip 到对象存储,改composer.json的dist.url指向该地址
最易被忽略的一点:Web 服务器用户(如 www-data)、Docker 非 root 用户、CI runner 使用的 service account,它们的 $PATH 和你本地 shell 完全隔离——装了 Git 也不代表 Composer 能调用到。










