--no-dev仅跳过require-dev包安装,不清理已装包内的tests/等目录;必须配合composer-archive-excludes插件的archive.excludes配置在解压阶段过滤路径,并启用--classmap-authoritative关闭运行时扫描。

直接加 --no-dev 不足以过滤掉 vendor 里已安装包内部的测试文件(如 tests/、Examples/),它只跳过 require-dev 包的安装,不清理已装包里的冗余目录。
为什么 composer install --no-dev 还留着 tests/ 目录
因为 --no-dev 只控制“装不装 dev 包”,不控制“装进来的包里删不删 tests/”。很多包(比如 monolog/monolog)的 tests/ 是随主包一起打包在 dist zip 里的,Composer 默认照单解压。即使你没装 phpunit,vendor/monolog/monolog/tests/ 依然存在。
-
composer install --no-dev不影响 dist 包解压行为,也不触发任何路径过滤 - autoload 规则(
autoload-dev)是否启用,和文件物理存在与否完全无关 - 某些包把示例代码放在
tests/下(如旧版 monolog 的 handler 示例),删了会导致运行时 fatal error
用 archive.excludes 在解压阶段跳过指定路径
这是目前最干净、最可控的方式:让 Composer 在解压 zip 包时就跳过你不想要的目录,它们根本不会落地到 vendor/。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(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"] } - 之后每次执行
composer install或composer update,这些路径都会被跳过——不是删,是压根不解压 - 注意路径以
/开头且为正则式匹配,/tests/会匹配vendor/foo/bar/tests/,但不会误伤test_helper.php
搭配 --classmap-authoritative 防止 autoload 扫描残留路径
即使你用 archive.excludes 成功过滤了 tests/,如果 autoloader 还在扫描整个 vendor/,遇到某些异常路径仍可能报错(尤其在容器或 NFS 环境下)。
- 确保
"optimize-autoloader": true已写入composer.json的config - 运行:
composer dump-autoload --optimize --classmap-authoritative --no-dev - 再重建 vendor:
composer install --no-dev --optimize-autoloader --classmap-authoritative - 这会让 autoloader 完全依赖
vendor/composer/autoload_classmap.php,彻底绕过scandir(),既提速又防误触
别手动 rm -rf vendor/*/tests
看似快,实则危险。有些包的 tests/ 里放的是可运行的工具类(比如 symfony/console 的 tests/Fixtures/Command/ 被某些 CLI 封装逻辑引用),或者 resources/ 下的模板被生产代码加载。删完可能上线就挂,而且无法复现。
- 手动清理无法被 CI 复制,容易漏掉某次部署
- 没有校验机制,删错一个路径就可能引发
Class not found或file not found - 真正安全的清理,必须由 Composer 自身机制驱动,而非 shell 脚本兜底
最易被忽略的一点:archive.excludes 只对 --prefer-dist 有效,而默认 install 可能走 git clone(尤其私有仓库未配 dist)。务必确认你的包来源是 zip,否则该配置形同虚设。










