composer本身不支持install/update时跳过已下载包中的文件,vendor中残留的tests/等需由包作者在发布时用archive.exclude排除或用户手动清理。

Composer 本身不会在 install 或 update 过程中“忽略”任何已下载包里的文件——你看到的 vendor/ 里残留的 tests/、docs/、.git/,不是它漏掉了什么,而是它压根没这个能力。
为什么 archive.exclude 对 vendor/ 完全无效
archive.exclude 只控制你**自己执行 composer archive**(或 Packagist 自动打包)时,哪些文件被打进 zip/tar 包。它不参与依赖安装流程,也不影响别人装你的包,更不决定你 vendor/ 里有什么。
- 第三方包里的
tests/是否存在,取决于**对方的archive.exclude或.gitattributes配置是否生效 - 你改自己项目的
archive.exclude,对vendor/monolog/monolog/里的文件毫无作用 - 路径写成
"*.md"或"**/Tests"是无效的——它只支持字面匹配和单层*,不支持通配符递归 - 大小写敏感:
"/Tests/"不会排除"/tests/",必须分开写
exclude-from-classmap 不是“禁止加载”,只是“不登记进 classmap”
这个配置常被误用为“排除测试类”,但它只在生成 vendor/composer/autoload_classmap.php 时跳过扫描指定路径,对 PSR-4 加载完全无感。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 如果
"App\": "src/"已声明,而src/Tests/ExampleTest.php符合命名空间规则,new AppTestsExampleTest()依然能成功——exclude-from-classmap拦不住 - 路径必须写在
autoload或autoload-dev块内,不能放在根级config下 - 修改后必须运行
composer dump-autoload -o,否则旧 classmap 缓存还在用 - 想确认是否生效?直接打开
vendor/composer/autoload_classmap.php,搜类名看还在不在
真正能减小 vendor/ 体积的只有这几种方式
别再指望靠各种 “exclude” 字段清理 vendor/,那些字段要么管不到,要么只管打包不管安装。
-
composer install --no-dev:跳过require-dev里的所有包,最直接有效 -
"config": {"preferred-install": {"*": "dist"}}:强制走 zip 包而非 git clone,避免带.git目录 -
composer install --optimize-autoloader --no-dev:合并自动加载 + 剔除开发依赖,上线部署标配 - 联系包作者:如果某个包始终带大量测试文件,唯一治本办法是提 issue,请对方补上
.gitattributes或archive.exclude
最容易被忽略的一点:即使你把所有配置都写对了,vendor/ 里仍可能出现“多余文件”——那大概率是包作者没配,或者配错了路径;而你在本地做的任何 exclude 配置,都不会反向作用于已安装的第三方代码。










