--prefer-dist是优先下载zip/tar压缩包的策略,非强制生效;需验证-v输出含downloading https archive、vendor无.git、composer show -s显示非空dist url才确认起效。

CI 里 Composer 安装慢,大概率不是网络问题,而是没走 --prefer-dist —— 但光加参数没用,得确认它真生效了,否则照样 Cloning into 'vendor/xxx' 卡住。
怎么判断 --prefer-dist 实际起作用了
别只看命令里有没有写 --prefer-dist,关键看行为:
- 加
-v运行composer install -v,输出中出现Downloading https://.../archive/...(含tarball、zipball或archive字样),且没有Cloning或git clone,才算真走 dist - 检查
vendor/some/package目录:里面没有.git文件夹,基本可断定是 dist 模式 - 运行
composer show vendor/package -s,若dist字段非空(含url和sha256),说明该包支持 dist 安装
为什么加了 --prefer-dist 还在 git clone
常见原因不是参数漏写,而是 dist 包不可用或被覆盖:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 包本身没打 tag(比如只推了
dev-main),Packagist 就不会生成dist.url,Composer 自动 fallback 到 source -
composer.json里写了"preferred-install": {"*": "source"},它会直接覆盖命令行的--prefer-dist - 环境变量
COMPOSER_PREFER_SOURCE=1已设置,优先级高于命令行参数 - 私有仓库(如 GitLab)没开启 archive 功能,或
composer.json的dist字段没配对,Composer 找不到压缩包地址
CI 脚本里怎么安全启用 --prefer-dist
必须配合镜像和缓存才真正有效,单加参数可能白忙:
- 先确保全局镜像已切到国内源:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,再跑composer clear-cache - CI 构建命令推荐组合:
composer install --prefer-dist --no-dev --optimize-autoloader --no-interaction - 缓存
~/.composer/cache目录,避免重复下载;仅当composer.lock变化时才重装 - 如果 Docker 镜像(如
php:alpine)没装git,别急着apk add git补救——那只是掩盖问题,不如直接确认--prefer-dist是否生效
开发机要不要全局开 prefer-dist
不建议。全局执行 composer config -g prefer-dist true 会影响日常调试:
- 你改
vendor/xxx里的代码时,--prefer-dist会让下次install直接覆盖掉修改(因为 dist 模式不保留.git) - path 类型仓库、
dev-xxx分支、本地未打 tag 的私有包,--prefer-dist会自动 fallback 失败,报Could not find a matching version of package - 开发阶段更需要
--prefer-source来 checkout 分支、打补丁、查 commit 历史,强制 dist 反而增加排查成本
真正容易被忽略的是:dist 模式依赖的是包是否发布了带 dist.url 的稳定版本,而不是你本地有没有 git。CI 卡在 Cloning,第一反应不该是“装 git”,而是查 composer.lock 里那个包的 dist 字段是否存在、是否可用。










