composer install 不支持运行时排除 tests/ 和 docs/;--no-dev 仅跳过 require-dev 包,不影响已安装包内文件;需通过 composer-archive-excludes 插件配合 archive.excludes 配置在解压阶段过滤,且必须搭配 --prefer-dist、--remove-vcs 及 --classmap-authoritative 才能彻底生效。

composer install 本身不支持运行时排除 tests/ 和 docs/
很多人以为 composer install --no-dev 会顺手删掉 vendor 里每个包的 /tests/ 或 /docs/ 目录,其实不会。这个参数只跳过 require-dev 中的包(比如 phpunit/phpunit),也不影响已安装包内部的文件结构。vendor 里的测试和文档,是随 dist zip 包一起下载下来的——能不能避开,取决于那个 zip 是怎么构建的。
真正生效的是 archive.excludes + composer-archive-excludes 插件
想让 /tests/、/docs/ 等路径压根不落地,得靠解压阶段过滤,不是安装后扫雷。步骤很明确:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(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"] } - ⚠️ 路径必须以
/开头,且不支持**或模糊匹配;写成"tests"或"Tests"不生效 - 该配置只对从 Packagist 下载的 zip 包(即
--prefer-dist模式)生效;git clone方式完全无视它
--no-dev --prefer-dist --remove-vcs 才是重建 vendor 的安全组合
光配 archive.excludes 不够,因为旧 vendor 可能已含测试文件。必须重装才能触发过滤:
- 先
rm -rf vendor(别跳过这步) - 再跑:
composer install --no-dev --prefer-dist --remove-vcs -
--prefer-dist强制走 zip 包,配合archive.excludes才起效 -
--remove-vcs能兜底删掉某些包 dist 里残留的.git目录 - 别用
composer update—— 它不会重新解压,也就不会触发 exclude 过滤
--classmap-authoritative 是瘦身生效的最后一环
前面所有操作只是“删文件”,但 PHP autoloader 默认仍会 scandir() 整个 vendor 目录找类。哪怕 /tests/ 已被跳过,扫描失败也可能在容器、NFS 或只读文件系统上引发加载异常。
- 确保
composer.json里有:"optimize-autoloader": true
- 运行:
composer dump-autoload --optimize --classmap-authoritative --no-dev - 后续部署必须带参数:
composer install --no-dev --optimize-autoloader --classmap-authoritative - 这步不减体积,但决定前面所有清理会不会白做——最容易被忽略的点就在这儿










