vendor目录瘦身最安全高效的方式是执行composer install --no-dev --prefer-dist --remove-vcs,配合archive.excludes精准过滤及--classmap-authoritative强制类映射。

vendor 目录体积大,不是因为装了太多包,而是默认保留了大量运行时完全不需要的文件——测试、文档、.git、examples、CHANGELOG 等。直接 rm -rf 某些目录风险高,必须按 autoload 规则裁剪,否则会报 Class not found。
用 --no-dev + --prefer-dist + --remove-vcs 重建 vendor
这是最安全、见效最快的组合,适用于部署或本地重装:
-
--no-dev:跳过require-dev中所有包(如phpunit、phpstan),省下几百 MB -
--prefer-dist:强制下载 zip 包而非 git clone,dist 包通常已剔除tests/、docs/、.github/等目录 -
--remove-vcs:安装时自动删掉每个包里的.git目录(有些包 dist 包里仍带.git,这个参数能兜底)
执行命令:composer install --no-dev --prefer-dist --remove-vcs。注意:不是 update,install 才会按 lock 文件重新拉取并裁剪。
启用 archive.excludes 精准过滤 tests/docs
--no-dev 不影响已安装包内部的 tests/ 目录,真正删它们得靠解压阶段过滤。官方没开关,但社区插件 composer-archive-excludes 可靠且轻量:
- 先安装:
composer require --dev composer-archive-excludes - 再配置(在
composer.json的config下):"archive": {"excludes": ["/tests/", "/docs/", "/examples/", "/.github/", "/CHANGELOG.md"]} - 之后每次
install或update,这些路径在解压 zip 时就被跳过,不会落地
⚠️ 别用 find vendor -name tests -type d -exec rm -rf {} + ——有些包(如旧版 monolog)把 handler 示例放 tests/ 下,删了就挂。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
加 --classmap-authoritative 强制关闭文件扫描
这步不减体积,但让“瘦身”真正生效:它让 autoloader 完全依赖 vendor/composer/autoload_classmap.php,彻底绕过 scandir() 遍历整个 vendor/ 目录找类文件。
- 先确保
"optimize-autoloader": true已写入composer.json的config - 运行:
composer dump-autoload --optimize --classmap-authoritative --no-dev - 后续
composer install --no-dev --optimize-autoloader --classmap-authoritative会重建 vendor 并只保留 classmap 里声明的路径
这对容器、NFS、只读文件系统特别关键——没有它,哪怕删了 tests/,autoload 还可能因扫描失败而报错。
检查 installed.json 确认是否真走 dist 模式
有时你以为用了 --prefer-dist,结果还是下了 source(比如某包没提供 dist,或镜像源 fallback 到 git)。验证方式:
- 打开
vendor/composer/installed.json - 搜索
"type":"library"的包,看其"install-path"字段是否含dev-master或dev-main - 如果出现,说明该包是 git clone 下来的 source 模式,里面大概率有完整
.git和tests/
这时要单独处理:查该包是否支持 dist(composer show vendor/package 看 dist 字段),或换镜像源(如阿里云、腾讯云 PHP 镜像),避免 fallback。
真正难的不是删文件,而是判断哪些能删——autoload 规则、包自身声明的 autoload 和 autoload-dev、dist 包是否干净,三者缺一不可。一个 tests/ 目录删错,就可能让某个动态加载的 handler 失效,这种问题在线上才暴露。

















