精简 vendor 体积核心是“不装”而非“删”:用 --no-dev、--prefer-dist、--remove-vcs 组合重建;配 archive.excludes 在解压时跳过 tests/docs;启用 --classmap-authoritative 关闭文件扫描;最后清理 vendor/bin 和 installed.json。

精简 vendor 目录体积,核心不是“删”,而是“不装”——文档、测试文件等从解压那一刻起就该被跳过。手动 find vendor -name tests -exec rm -rf {} + 是高危操作,旧版 monolog/monolog 的 tests/ 里放着 StreamHandler 示例类,删了直接 Class not found。
用 --no-dev + --prefer-dist + --remove-vcs 重建 vendor
这是最安全、见效最快的部署级组合,必须在干净环境下执行(先 rm -rf vendor):
-
--no-dev:跳过require-dev中所有包(如phpunit、phpstan),省下 30%~60% 体积 -
--prefer-dist:强制走 zip 包而非 git clone;dist 包通常已剔除tests/、docs/、.github/ -
--remove-vcs:兜底清除 dist 包里残留的.git目录(某些包打包不规范,zip 里仍含.git)
⚠️ 注意:必须用 composer install,不是 update——只有 install 才会按 composer.lock 重新拉取并裁剪。
配 archive.excludes 在解压时过滤 tests/docs
--no-dev 和 --prefer-dist 解决不了包作者把 tests/ 打进 zip 的问题。真正精准剔除,得靠解压阶段跳过:
- 先安装插件:
composer require --dev composer-archive-excludes - 在
composer.json的config.archive.excludes下加路径:["/tests/", "/docs/", "/examples/", "/.github/", "/CHANGELOG.md"] - 之后每次
install或update,匹配路径在 unzip 阶段就被跳过,根本不会落地
⚠️ 别写成 "tests" 或 "Tests" ——必须带前导 /,否则匹配不生效;也别加 **,这个插件不支持 glob 通配。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
启用 --classmap-authoritative 强制关闭文件扫描
这步不减体积,但让前面所有“瘦身”真正生效。否则即使删了 tests/,autoloader 仍可能因 scandir() 失败而报错(尤其在容器、NFS、只读文件系统):
- 确保
composer.json的config块里有"optimize-autoloader": true - 运行:
composer dump-autoload --optimize --classmap-authoritative --no-dev - 后续部署统一用:
composer install --no-dev --optimize-autoloader --classmap-authoritative
它会让 autoloader 完全依赖 vendor/composer/autoload_classmap.php,彻底绕过目录遍历——这才是生产环境稳定加载的底线。
清理 vendor/bin 和 installed.json 这类隐藏膨胀源
有些体积杀手藏得深:
-
vendor/bin/下的二进制(如php-cs-fixer)虽不参与 autoload,但每个都带完整依赖树,占几 MB;若线上真不用,可在部署脚本末尾加:find vendor/bin -type f ! -name "your-needed-bin" -delete -
vendor/composer/installed.json可达几 MB,且无法跳过;若用--classmap-authoritative,可考虑在 CI 后用rm -f vendor/composer/installed.json(不影响运行) - 某些包(如
symfony/console)自带Resources/doc/或Tests/,archive.excludes不生效(因非 dist 模式或路径不匹配),这时才轮到部署脚本补刀:find vendor/ -path "*/symfony/console/Resources/doc" -prune -exec rm -rf {} +
关键点:所有清理动作必须在 composer install 之后、应用启动之前完成;顺序错了,autoload_classmap.php 就可能引用已删路径,导致运行时报错。










