查私有包被谁拉入:先用composer show vendor/private-package确认安装,再执行composer depends --tree vendor/private-package;若为空,检查replace/provide或grep -a5 -b5 '"vendor/private-package"' composer.lock。

私有仓库的依赖树和体积问题比公开包更难定位——因为没有 Packagist 页面可查下载量、没有社区反馈能提示冗余,且 composer show 默认不暴露私有包内部结构。必须用组合命令+人工验证才能看清真实依赖链和磁盘开销。
怎么查私有包被谁拉进来(composer why-usage 失效时)
私有仓库包通常不被 composer why-usage 识别(尤其当它没在 Packagist 注册或使用了自定义 type),此时需手动反向追踪:
- 先确认该包是否真被安装:
composer show vendor/private-package,看是否显示“installed”及版本号 - 再用
composer depends --tree vendor/private-package(Composer ≥2.5),它会无视源类型,只读composer.lock中的依赖关系 - 如果仍为空,说明它可能是通过
replace或provide声明“虚拟存在”的,检查根composer.json的replace和provide字段 - 最后 grep 锁文件:
grep -A5 -B5 '"vendor/private-package"' composer.lock,看它的require列表里有哪些上游包
私有包体积大?先看它有没有 .git 和 node_modules
私有仓库常因开发流程不规范,把整套 Git 历史或前端构建产物一起推上,导致单个包占几十 MB。别急着删,先确认安装方式:
- 运行
ls -la vendor/vendor/private-package/.git,如果存在,说明用了--prefer-source安装;改用composer install --prefer-dist可避免 - 检查
vendor/vendor/private-package/node_modules或build/目录——这类文件绝非 PHP 运行所需,应从私有仓库的.gitattributes中声明node_modules export-ignore - 若已安装,可安全清理:
find vendor/vendor/private-package -name "node_modules" -type d -prune -exec rm -rf {} + - 注意:不要删
vendor/composer/installed.json,否则composer dump-autoload会失败
私有包 autoload 配置混乱导致 vendor 膨胀
很多私有包在 composer.json 里把整个 src/ + tests/ + examples/ 全塞进 autoload.classmap,结果 autoloader 映射表暴涨,类加载变慢,vendor 体积也虚高。
- 用
composer show vendor/private-package | grep autoload查它声明了哪些 autoload 规则 - 若看到
"classmap": ["src/", "tests/", "examples/"],这就是问题源头——tests/根本不该进生产 autoload - 临时修复:在项目根目录加
autoload-dev覆盖,但长期方案是让私有包维护者发布新版本,只保留src/到classmap - 验证效果:
composer dump-autoload -o && ls -lh vendor/composer/autoload_classmap.php,优化后文件应明显缩小
CI 中怎么自动监控私有依赖体积突增
私有包更新没人 review,最容易悄悄膨胀。CI 里加一行检查,比人肉 du 更可靠:
- 部署前跑:
du -sh vendor/vendor/private-package | awk '{print $1}' | sed 's/M//; s/K//' | awk '{if ($1 > 5000) exit 1}'(限制 5MB) - 配合
composer show --tree截图存档,每次 PR 自动上传到内部 Wiki,方便回溯 - 关键点:必须在
composer install --no-dev --optimize-autoloader后执行,否则含 dev 文件干扰判断 - 别信
composer show -s——它不返回体积,只返回源地址,对私有包甚至可能为空
私有包的问题从来不在“能不能装”,而在“装了什么、谁在用、为什么需要”。最危险的不是体积本身,是那些没人记得为什么加进去、也没人敢删的传递依赖——它们往往藏在 composer.lock 深处,只等某次 composer update 就突然翻倍。











