vendor目录残留源于状态未收敛,需同步清理vendor、autoload映射、opcache及本地缓存四层;换镜像源后应执行composer install而非update,并补上dump-autoload -o和opcache_reset()。

vendor目录残留不是镜像源导致的,是状态没收敛
换镜像源本身不会让 vendor 里多出文件,也不会让已删包“复活”。你看到的残留,本质是 composer remove 或手动改 composer.json 后,没走完后续同步动作:vendor 目录、autoload 映射、OPcache 缓存三者都没刷新。
常见错误现象包括:composer show foo/bar 仍返回版本号、ls vendor/foo 还存在、grep "foo/bar" vendor/composer/autoload_*.php 有匹配结果——只要其中任一成立,就说明清理没完成。
- 镜像源只影响下载路径和速度,不参与依赖解析或文件清理逻辑
- 换源后执行
composer update可能触发意外升级(因 lock 文件未变但新源返回不同 dist URL),这不是残留,是版本漂移 - 真正该怀疑的是:上一次
remove是否加了--no-update?是否在 CI 中超时中断?是否手动删过vendor/下某目录却没跑install?
换镜像源后必须重跑 install 而非 update
换源后直接 composer update 是危险操作:它会用新镜像重新解析整个依赖树,可能拉取新版子依赖,破坏 lock 文件原本锁定的行为。而 composer install 才是严格按当前 composer.lock 重建 vendor,顺便把所有“声明已删但文件还在”的包物理清掉。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先确认
composer.json已干净(require和require-dev里无目标包) - 运行
composer install --no-dev(生产环境)或composer install(开发环境) - 如果
composer.lock本身被污染(比如之前手动改过、或旧镜像下生成的 hash 失效),可删掉它再composer install—— 仅限开发环境 - 别用
composer update --with-dependencies来清理:它会升级间接依赖,不是纯同步
autoload 映射和 OPcache 是最隐蔽的残留点
即使 vendor/ 目录里文件已被删,vendor/composer/autoload_psr4.php 里还留着命名空间映射,PHP 就仍会尝试加载不存在的路径,报错却是 Class not found 而非 Cannot open file,容易误判。
- 必须补上
composer dump-autoload --classmap-authoritative -o,强制重建所有 autoload 文件 - 手动打开
vendor/composer/autoload_*.php,搜索包名,确认无任何残留条目 - 如果开了 OPcache(绝大多数生产环境都开),必须调用
opcache_reset();APCu 同理,apcu_clear_cache() -
composer dump-autoload不带-o参数等于白跑:它只更新 PSR-4 映射,不清理 classmap 里的废弃路径
缓存目录里藏着“假残留”
换镜像源后,~/.composer/cache/files/ 里可能还堆着旧源下载的老包 ZIP,但它们不影响 vendor 内容。真正要警惕的是 ~/.composer/cache/vcs/:每个 Git 裸仓库占 300–800 MB、成千上万个文件,极易耗尽 inodes,导致 No space left on device,而 composer clear-cache 默认不碰它。
-
composer clear-cache只清files/,不清理vcs/,也不动vendor/ - 精准清理
vcs/:进该目录,按修改时间排序,删掉半年以上未访问的裸仓库(ls -t | tail -n +50 | xargs rm -rf) - 长期方案:在
composer.json的config块里加"cache-vcs": false,禁用 VCS 缓存 - 临时目录(如
/tmp或%APPDATA%\Local\Temp)也常被 Composer 用作解压中转,需一并检查
换镜像源本身很简单,难的是状态一致性。vendor 目录、autoload 映射、OPcache、本地缓存这四层,漏掉任何一层,都会让“已删包”看起来还活着。尤其 dump-autoload -o 和 opcache_reset() 这两步,90% 的人会跳过,然后花半天查为什么类还能加载却找不到定义。










