直接运行composer install --no-dev --prefer-dist --remove-vcs可严格按lock文件重建vendor,剔除dev包、.git、tests/等无用文件;它比remove更有效,因能清理require-dev残留、间接依赖及lock中幽灵包,而remove仅处理显式声明的包。

直接运行 composer install --no-dev --prefer-dist --remove-vcs 就能清理掉绝大多数废弃包——它不靠猜、不靠删,而是让 Composer 严格按当前 composer.json 和 composer.lock 重建 vendor,连带剔除 dev 包、.git、tests/ 等运行时无用文件。
为什么 composer install 比 remove 更适合批量清理废弃包
废弃包往往不是“单个被声明又删除”的包,而是:require-dev 里残留的旧工具、被其他包间接拉入但项目代码根本没调用的子依赖、或 lock 文件里还存着但 json 已删的“幽灵包”。composer remove 只处理显式声明的包,对这类隐性残留无效。
-
composer install是唯一能强制对齐composer.json+composer.lock+vendor/三者状态的操作;remove只改前两者 - 加
--no-dev后,所有require-dev包(包括它们的子依赖)都不会进 vendor,哪怕phpstan/phpstan还在悄悄 requirephpunit/phpunit,也会被跳过 -
--prefer-dist强制走 zip 包而非 git clone,天然避开 .git 和大量文档类文件;--remove-vcs则兜底清除 dist 包里漏网的 .git 目录 - 注意:必须用
install,不是update。后者只重写 lock,不重建 vendor,残留照旧
composer install --no-dev 后 vendor 还很大?检查这三处 autoload 陷阱
体积没降下来,大概率是 autoloader 还在扫描已删包的路径,或 classmap 里留着旧映射。这不是磁盘没删干净,而是加载逻辑还在兜底。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 运行
composer dump-autoload --optimize --classmap-authoritative --no-dev:强制生成权威 classmap,后续 autoload 完全不 scan vendor 目录,只查vendor/composer/autoload_classmap.php - 检查
vendor/composer/autoload_psr4.php是否还有"Tests\"或"Stubs\"这类 dev-only 命名空间映射——remove --dev有时中断会残留,得手动删再dump-autoload - 确认
composer.json的autoload.files或autoload.psr-4里没硬编码引用已删包的路径,比如"Monolog\": "vendor/monolog/monolog/src/"
中文项目特别容易漏掉的三类残留
Laravel、ThinkPHP 或自研框架常通过配置驱动、服务发现、反射注册扩展,这些不会被 install 或 remove 触及,但会导致包虽删、功能仍生效或报错。
- 配置文件里硬写的驱动名:如 Laravel 的
config/logging.php中'driver' => 'monolog',删了包但配置没清,启动就报错 - Service Provider 注册:Laravel 的
config/app.php里MonologLogger::class或自定义 provider,需手动移除 - 框架级插件机制:如 ThinkPHP 的
extra.think-addons配置、或某些 SDK 在bootstrap/app.php里动态 require 的文件,grep 不到命名空间,得翻 config
真正瘦身的关键不在删多少包,而在确认 autoload 不再扫描、配置不再引用、运行时不触发任何 fallback 加载——否则哪怕 vendor 少了 200MB,一个 class_exists('SomeLegacyClass') 就可能把整包又拖回来。










