因为Composer默认不清理已安装但未声明的包及tests/docs等开发文件,即使加--no-dev;需先rm -rf vendor/和composer.lock,再用composer install --no-dev --optimize-autoloader --classmap-authoritative重建,最后通过composer-cleaner插件按配置精准删除冗余路径。

为什么 composer install --no-dev 仍会留下冗余文件?
因为 Composer 默认不会删除 vendor/ 中已安装但当前 composer.json 不再声明的包,也不会清理测试、文档、示例等开发期文件(如 tests/、docs/、.git/、README.md),哪怕你加了 --no-dev。这些文件在极简部署中既不运行也不被加载,纯属体积和安全风险。
用 composer-cleaner 插件自动删掉非运行必需文件
官方不提供“清理 vendor 冗余”功能,得靠社区插件。目前最轻量可靠的是 composer-cleaner,它不改依赖逻辑,只扫描并删除明确与运行无关的路径。
- 安装:运行
composer global require elie/composer-cleaner(推荐全局装,避免污染项目) - 配置:在项目根目录
composer.json的"extra"下加清理规则,例如:
"extra": {
"cleaner": {
"exclude": [
"/tests/",
"/Tests/",
"/docs/",
"/Examples/",
"/example/",
"/.github/",
"/.git/",
"/README.*",
"/CHANGELOG.*",
"/LICENSE.*"
]
}
}
注意:exclude 是正则路径匹配,开头斜杠表示从包根开始;不写 vendor/ 前缀,插件自动作用于每个已安装包内部。
部署时组合执行:重装 + 清理 + 验证
单靠清理不能保证一致性,必须先确保 vendor/ 是干净重建的,再删冗余。CI/CD 或部署脚本里应按顺序执行:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
rm -rf vendor/ composer.lock(强制从头开始,避免残留) -
composer install --no-dev --optimize-autoloader --classmap-authoritative(最小化运行依赖 + 加速加载) -
composer cleaner(触发插件清理) - 可选验证:
find vendor/ -name 'tests' -o -name '.git' | head -5确认无残留
别跳过第一步 rm -rf vendor/ —— 如果保留旧 vendor/ 直接跑 cleaner,它只会清理已有目录里的匹配项,不会处理已被 Composer 卸载但文件还卡在那里的“幽灵残留”。
自定义清理要小心 autoload 和扩展依赖
有些包把运行时必需的模板、schema 或 DSL 文件放在 resources/ 或 stubs/ 下,误删会导致运行时报错(比如 Laravel 的 database/migrations/ 模板虽在 vendor 里,但 php artisan make:migration 会读它)。清理前务必确认:
- 该路径是否出现在包的
autoload.files或autoload.psr-4映射中(查vendor/{vendor}/{pkg}/composer.json) - 是否被框架或工具通过
__DIR__硬编码引用(比如某些 SDK 的config/目录) - PHP 扩展类(如
ext-redis)不存于vendor/,但它的 PHP wrapper 包(如predis/predis)可能带examples/,这类可放心清
真正极简部署的关键不是删得最多,而是删得“确定不执行、不加载、不反射、不 require_once”的部分——这点很容易被脚本自动化忽略。

















