最安全高效的 vendor 目录瘦身方案是执行 composer install --no-dev --prefer-dist --remove-vcs:--no-dev 跳过开发依赖,--prefer-dist 下载精简 zip 包,--remove-vcs 彻底清除 .git;再配合 composer-archive-excludes 插件在解压时过滤 tests/、docs/ 等目录,并启用 --classmap-authoritative 强制类映射提升性能与稳定性。

vendor 目录大,不是包太多,而是默认塞进了大量运行时完全用不到的文件——.git、tests/、docs/、examples/、CHANGELOG.md。手动删目录风险极高,Class not found 错误大概率由此而来。
用 composer install --no-dev --prefer-dist --remove-vcs 重建 vendor
这是最安全、见效最快的组合,必须用 install(不是 update),它会严格按 composer.lock 重新拉取并裁剪:
-
--no-dev:跳过require-dev中所有包(如phpunit、phpstan),省下几百 MB -
--prefer-dist:强制下载 zip 包而非 git clone;dist 包通常已剔除tests/、docs/、.github/等目录 -
--remove-vcs:安装时自动删掉每个包里的.git目录(有些 dist 包仍残留.git,这个参数能兜底)
配 archive.excludes 在解压阶段精准过滤
--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 还可能因扫描失败而报错。
别忽略 composer depends 和 composer show --tree
vendor 体积膨胀常因引入了整条冗余依赖树。比如只用 monolog/monolog,却顺带下了 symfony/console、symfony/filesystem 等根本没被 TP 或 Laravel 核心调用的包。
- 查谁依赖某个包:
composer depends symfony/console - 看完整依赖树:
composer show --tree - 确认某包真没被加载:全局搜
use Symfony\Console、new ConsoleApplication(),再检查配置是否间接启用 - 移除前务必加
--dry-run:composer remove symfony/console --dry-run
真正难处理的是 autoload 配置不干净的包——比如它的 autoload.classmap 里包含了 tests/ 路径,这种得 fork 后删掉再发私有版,或提 PR 去上游修复。










