默认多数用--prefer-dist,但会因lock记录、无dist包、环境变量或dev分支等回退source;确认方式:-v看下载url或cloning日志、检查vendor内有无.git、用composer show查dist.url。

Composer 默认多数时候就走 --prefer-dist,但不是“一定”或“永远”——它会悄悄回退到 --prefer-source,尤其在你没注意 lock 文件、包配置或环境变量时。
怎么确认当前安装是否真的用了 --prefer-dist
别光看命令里有没有加参数,得看实际行为:
- 加
-v运行:composer install -v,输出中出现Downloading https://...(带 ZIP/TAR 路径)就是 dist;若看到Cloning git@github.com:或Executing command (CWD): git clone,说明 fallback 到 source 了 - 检查
vendor/xxx目录:里面没有.git子目录 → 大概率是 dist;有完整.git/→ 肯定是 source - 运行
composer show vendor/package,看输出里dist段是否非空,且url字段是https://开头的有效地址
--prefer-dist 为什么有时不生效
即使你写了 composer install --prefer-dist,仍可能走 source,常见原因:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer.lock里该包记录的是"source"类型(比如上次用了--prefer-source,或 CI 环境里缓存了旧 lock) - 包本身没提供
dist信息:私有仓库未打 tag、composer.json没配archive、或镜像源同步滞后导致dist.url返回 404 - 环境变量
COMPOSER_PREFER_SOURCE=1已设置(常出现在某些 CI 模板或 Dockerfile 中) - 依赖约束是
dev-master或dev-feature/xxx这类开发分支,且 packagist 未为该 commit 生成 dist 归档
如何真正强制所有包走 --prefer-dist
临时命令最直接,但长期项目建议靠配置落地:
- 每次安装都显式加参数:
composer install --prefer-dist --no-dev --optimize-autoloader(--no-dev减少干扰,--optimize-autoloader附带验证 autoload 是否可用) - 项目级控制:在
composer.json的config段写:"config": { "preferred-install": "*": "dist" } - 全局统一(CI/CD 推荐):
composer config -g preferred-install dist - 注意:
preferred-install不会修改已安装的包——如果 vendor 里已是 source 模式,composer update会先删再重下 dist,不是增量切换
dist 和 source 对 CI/CD 和生产部署的真实影响
选错方式会在关键环节掉链子:
- CI 环境没装 Git 或 SSH key 配置不全 →
--prefer-source直接失败,报Failed to execute git clone - source 模式下
vendor/体积大出 2–5 倍(含完整 Git 历史),拉取慢、缓存失效率高、Docker 层变厚 - dist 包不可修改,但能确保构建可重现;source 包允许 patch,但
composer update可能拉新 commit,绕过版本锁,引发意外变更 - 某些私有 GitLab 仓库默认禁用 archive 功能,即使设了
"preferred-install": "dist",也会静默 fallback,需后台开启repository archival或手动补dist字段
最易被忽略的一点:镜像源返回的元数据是否完整,比参数本身更重要。阿里云、USTC 镜像偶尔同步延迟,dist.url 指向 404 时,Composer 不会报错提示“dist 不可用”,而是默默切到 source —— 所以排查要从 composer show 和 composer install -v 日志起步,而不是只盯参数。










