vendor目录体积大主因是包含tests/docs等非运行时文件;应重装vendor并用--no-dev--prefer-dist--remove-vcs组合裁剪,配archive.excludes过滤解压路径,并启用--classmap-authoritative禁用autoload扫描。

vendor 目录体积大,不是装了太多业务包,而是默认把 tests/、docs/、.git、examples/ 这些运行时完全不需要的文件全塞进来了。靠手动删目录(比如 find vendor -name tests -exec rm -rf {} +)极大概率触发 Class not found 错误——因为有些包(如旧版 monolog/monolog)真把 StreamHandler 示例代码放在 tests/ 下,且 autoload 映射里写了这条路径。
用 composer install --no-dev --prefer-dist --remove-vcs 重建 vendor
这是最稳、最快、CI 友好的基础组合,必须重装才生效(update 不触发裁剪):
-
--no-dev:跳过require-dev所有包(如phpunit、symfony/var-dumper),省下几百 MB;检查是否误把sebastian/environment写进了require -
--prefer-dist:强制下载 zip 包而非 git clone;dist 包通常已剔除tests/、docs/、.github/ -
--remove-vcs:兜底删掉 dist 包里残留的.git目录(某些包打包不规范,zip 里还塞了.git)
执行前先 rm -rf vendor,再跑命令。别跳这步,否则已有文件不会被重写。
配 archive.excludes 在解压阶段过滤 tests/ 和 docs/
这个配置只对从 Packagist 下载的 zip 包生效,是真正删掉包内部 tests/ 的唯一可靠方式:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先安装插件:
composer require --dev composer-archive-excludes - 在
composer.json的config块里加:"archive": { "excludes": ["/tests/", "/docs/", "/examples/", "/.github/", "/CHANGELOG.md"] }
之后每次 composer install 或 composer update,匹配路径在解压时就被跳过,根本不会落地。⚠️ 别用 find vendor -name tests -type d -exec rm -rf {} +——它不看 autoload 规则,纯暴力删,极易挂。
加 --classmap-authoritative 让瘦身真正生效
前面所有操作都只是“删文件”,但如果不关掉 autoload 扫描,PHP 还会去遍历整个 vendor/ 找类,哪怕 tests/ 目录已被删,扫描失败也可能导致加载异常,尤其在容器或 NFS 环境下:
- 确保
composer.json中已设"optimize-autoloader": true - 运行:
composer dump-autoload --optimize --classmap-authoritative --no-dev - 后续
install命令带上--optimize-autoloader --classmap-authoritative,autoloader 就只认vendor/composer/autoload_classmap.php里的路径
这步不减体积,但决定了前面所有清理会不会白做。最容易被忽略的点就在这儿——删完不关扫描,等于裸奔。
精简镜像过滤的关键细节
Docker 构建时,archive.excludes 配置必须在 composer install 阶段生效,不能靠构建后 RUN rm -rf vendor/*/tests 补救。同时注意私有包若未定义 dist 或走 path 类型源,archive.excludes 不起作用;这类包需改用 replace 或 fork 后清理再发布。另外,vendor/bin 下的脚本虽不进 autoload,但每个都带依赖树,上线前应确认是否真需要——比如 phpunit 脚本在线上毫无意义,却可能占几 MB。










