真正吃空间的是包内部的 tests/、docs/、.git 目录及 dev-only 传递依赖;需用 du 或 PowerShell 查体积大户,通过 archive.excludes、--classmap-authoritative 和 --remove-vcs 联动清理,且 lock 文件须先执行 composer update --no-dev -o 确保干净。

直接加 --no-dev 和 --prefer-dist 不够,vendor 体积仍可能超 150MB——真正吃空间的是包内部的 tests/、docs/、.git 目录,以及被误拉进来的 dev-only 传递依赖。
怎么确认哪些包在偷偷膨胀 vendor
别信 composer show -s,它根本不显示磁盘占用。用系统命令定位真大户:
- Linux/macOS:
du -sh vendor/* | sort -hr | head -10,重点关注有.git、node_modules、build/或体积 >10MB 的包 - Windows PowerShell:
Get-ChildItem vendor | ForEach-Object { [PSCustomObject]@{Name=$_.Name; Size=(Get-ChildItem $_.FullName -Recurse | Measure-Object -Property Length -Sum).Sum} } | Sort-Object Size -Descending | Select-Object -First 10 - 进目录后执行
ls -la,看到tests/占 20MB+、resources/里塞了 Chromium 二进制,基本就是误装或设计缺陷
为什么 composer install --no-dev 后还是有 phpunit 目录
因为 --no-dev 只跳过 require-dev 顶层声明的包,但拦不住传递依赖:比如 laravel/framework 在 require 里写了 symfony/var-dumper,而后者又 require phpunit/php-code-coverage —— 它就合法混进来了。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 查源头:运行
composer why-usage phpunit/phpunit(Composer ≥2.4)或composer depends phpunit/phpunit(旧版) - 看输出里是否出现
require-dev链路,比如myapp dev-master requires phpunit/phpunit (^10.0),那就得先挪到require-dev再删 - 如果只被一个 dev 包引用,且你确认生产环境真不用,加
--ignore-platform-reqs强制不装,但要手动验证日志组件等是否还正常
怎么安全删掉 tests/ docs/ 这类目录
手动 rm -rf vendor/*/tests 是高危操作——有些包(如 monolog/monolog)把 Handler 示例放 tests/ 下,autoload 里又没声明,删完运行时报 Class not found。
- 首选方案:启用
archive.excludes插件,在composer.json的config块加:"archive": {"excludes": ["/tests/", "/docs/", "/examples/", "/.github/", "/CHANGELOG.md"]},再跑composer install --no-dev --prefer-dist,解压时直接跳过 - 次选方案:确保
"optimize-autoloader": true已写入composer.json,然后执行composer dump-autoload --optimize --classmap-authoritative,它会基于 autoload 规则生成精简 classmap,后续install只保留映射里的路径 - 兜底清理:
composer install --no-dev --prefer-dist --remove-vcs,--remove-vcs能干掉残留的.git目录,哪怕 dist 包里自带也删
哪些配置组合最容易被忽略却最关键
单点优化效果有限,真正见效的是三者联动:锁文件干净 + 安装参数明确 + autoload 权威化。
-
composer.lock必须不含 dev 冗余:上线前跑一次composer update --no-dev -o,强制刷新 lock 文件中非 dev 部分 - Dockerfile 中顺序不能错:先
COPY composer.json composer.lock ./,立刻RUN composer install --no-dev --prefer-dist --optimize-autoloader --classmap-authoritative,中间插任何composer update都会让前面白做 -
--classmap-authoritative不是可选项:它让 autoloader 彻底关闭scandir(),否则哪怕删了tests/,运行时扫描失败仍可能报错,尤其在容器或只读文件系统上

















