composer install --prefer-dist --no-dev 在私有包缺失 dist 归档、repositories 未配置 dist、或 composer.json 显式定义 source 但无 dist 时会静默回退到 source 模式,导致 vendor 仍膨胀。

为什么 composer install 下载的 vendor 比实际需要大很多
因为默认会下载完整源码(--prefer-source),包含 .git 目录、测试文件、文档、未编译资源,甚至开发用的 bin 脚本。尤其当项目依赖了 Laravel、Symfony 这类大生态包时,单个包的源码体积可能比发布包大 3–5 倍。
常见错误现象:vendor/symfony/console 占用 20MB+;vendor/composer/installed.json 显示大量 source 类型条目;CI 构建缓存因 vendor 波动失效。
- 使用
--prefer-dist强制走压缩包(tar.gz / zip),跳过 git 克隆和历史下载 - 加
--no-dev排除require-dev中的包(如 phpunit、phpstan、fakerphp/faker)——它们在生产环境完全无用 - 确保
COMPOSER_NO_DEV=1环境变量已设(某些 CI 镜像默认不生效) - 注意:如果项目里用了
path类型仓库或本地开发中的未提交修改,--prefer-dist会失败并自动回退到 source —— 这是设计行为,不是 bug
composer install --prefer-dist --no-dev 在哪些场景下会失效
不是所有包都提供 dist 归档。有些私有包只配置了 type: package + dist 字段但没真正上传 zip;有些通过 repositories 指向 GitHub raw URL,却没带 dist 描述;还有些包在 composer.json 里显式写了 "source": { ... } 且没配 "dist"。
此时 Composer 会静默 fallback 到 source,vendor 依然膨胀,但命令不报错 —— 很难察觉。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 运行
composer install --prefer-dist --no-dev -v查看每步日志,留意是否出现Downloading ... from dist或Cloning ... from source - 检查
composer show --platform和composer show --all输出中各包的type和dist字段是否存在 - 私有包若托管在 GitLab/GitHub,确保其
composer.json含完整dist定义,且 zip 包可公开访问(或 token 配置正确)
如何验证 vendor 是否真的变小了
别只看总大小 —— 有些包删掉 dev 依赖后体积变化不大,但有些(比如 phpunit/phpunit)直接省掉 15MB+。关键是确认「不该存在的东西确实没进来」。
- 执行
du -sh vendor/* | sort -hr | head -10快速定位大户,再进目录看有没有tests/、.git/、bin/这类 dev-only 目录 - 检查
vendor/composer/installed.json,搜索"type":"library"的包,确认其"install-path"下没有dev-master或dev-main这类分支名(那是 source 模式标志) - 对比两次安装后的
composer.lock:diff一下,重点关注"source"→"dist"的变更,以及require-dev相关条目是否彻底消失
CI/CD 中漏掉 --no-dev 是最常踩的坑
很多团队在本地跑 composer install 没问题,一上 CI 就发现构建慢、镜像大、甚至磁盘爆满。根本原因:CI 脚本写的是 composer install --prefer-dist,但没加 --no-dev,而 composer.json 里 require-dev 一堆大包。
- GitHub Actions 中,
composer/installer-action默认不启用--no-dev,必须显式传参:args: --prefer-dist --no-dev - Docker 构建时,如果
composer install放在多阶段中间层,忘了--no-dev,会导致最终镜像带上 phpunit、symfony/debug 等调试工具 —— 生产环境不需要,还暴露攻击面 - 更隐蔽的问题:某些包(如
doctrine/orm)的require-dev会间接拉入twig/twig的 dev 版本,而该版本又带完整文档和示例 —— 不加--no-dev,这些也会悄悄进来
真正起效的最小命令就是 composer install --prefer-dist --no-dev,少一个参数,vendor 就可能多出几十 MB。别信“反正磁盘够用”,压缩包和源码的网络传输、解压耗时、inode 占用,都是实打实的成本。










