光用 composer install --no-dev 不够,必须加 --prefer-dist --optimize-autoloader --classmap-authoritative:前者跳过 dev 包但不清 autoload 映射,后者强制 dist 下载、生成完整 classmap 并禁用 fallback 扫描,四者互锁生效,缺一则体积不减或类加载失败。

光用 composer install --no-dev 不够,vendor 目录仍可能大出 2~3 倍——因为没动包内部的 tests/、.git/、docs/,也没关掉 autoload 扫描兜底逻辑。
必须加的四个安装参数:--no-dev --prefer-dist --optimize-autoloader --classmap-authoritative
这四个参数不是“可选优化”,而是互锁生效的最小安全集:
-
--no-dev:跳过require-dev中所有包(如phpunit/phpunit),但不会清理已存在的 autoload 映射;漏掉它,vendor/bin/phpunit这类二进制可能被意外执行 -
--prefer-dist:强制走 zip 包而非 git clone,避免带入.git/和未裁剪的源码树;对私有包无效,除非你明确配置了dist字段 -
--optimize-autoloader:生成vendor/composer/autoload_classmap.php,把类名直连路径;不加它,每次请求都要scandir()扫目录,autoload 耗时从 0.05ms 涨到 1.2ms+ -
--classmap-authoritative:让 autoloader 彻底放弃 fallback 到 PSR-4 扫描——性能翻倍,但要求所有用到的类都必须进 classmap;否则class_exists("Foo" . $suffix)类动态拼名会直接失败
注意:composer install 才触发这些行为,update 不会重装或重裁 vendor;已有 vendor 需先 rm -rf vendor 再重装。
删 vendor 里哪些东西?别信 find -name tests -delete
手动删 tests/ 看似简单,但极危险:旧版 monolog/monolog 把 Handler 示例放 tests/ 下,删了就 Class not found。真正该删的是明确与运行无关、且无 autoload 注册的残留:
-
vendor/bin/:全删,除非你真需要phinx或doctrineCLI 在线上运行 -
vendor/**/.git、vendor/**/.github、vendor/**/phpunit.xml:暴露元数据和 CI 配置,可能辅助攻击者判断组件版本 -
vendor/composer/installed.json:含全部包哈希与版本号,泄露后等于把漏洞地图送给扫描器 -
vendor/**/docs/、vendor/**/examples/、vendor/**/demo/:纯文档,不参与加载,但占空间且可能被 Web 服务器误配暴露
推荐命令(Linux/macOS):rm -rf vendor/bin vendor/*/tests vendor/*/docs vendor/*/examples vendor/composer/installed.json —— 显式、可读、CI 友好。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
怎么让 tests/ docs/ 在解压时就不落地?用 archive.excludes 插件
靠安装后删是补救,源头过滤才可靠。Packagist 上的 dist 包支持在 unzip 阶段跳过指定路径:
- 先装插件:
composer require --dev composer-archive-excludes - 在
composer.json的config节点下加:
"archive": {
"excludes": ["/tests/", "/docs/", "/examples/", "/.github/", "/CHANGELOG.md"]
}
之后每次 composer install 或 update,这些路径就不会解压进 vendor;但注意:仅对提供 dist 归档的包生效,path 类型或 source 模式仓库不走这个流程。
为什么 dump-autoload 单独跑没用?classmap 必须跟 install 绑定
composer dump-autoload --optimize --classmap-authoritative 看似能瘦身,但它只重写 autoload 文件,不删已下载的 tests/ 或 .git/ 目录——体积根本没变。更关键的是:
- classmap 是基于当前 vendor 文件结构生成的,如果
tests/还在那儿,它可能被错误扫描进去 -
--classmap-authoritative生效的前提是 classmap 完整覆盖所有运行时类;若你删了某些目录但没重装,classmap 就漏了,autoload 直接崩 - CI/CD 中常见错误:先
install --no-dev,再dump-autoload --optimize,却忘了加--classmap-authoritative,结果 fallback 扫描照常开销
真正可靠的流程只有一条:rm -rf vendor && composer install --no-dev --prefer-dist --optimize-autoloader --classmap-authoritative,再清理残留目录。中间任何跳步,都可能让瘦身失效或引入运行时风险。










