composer update不拉最新代码是因为默认缓存包(zip、dist、git浅克隆),命中即跳过远程校验;应执行composer clear-cache清全局缓存,或对单包用--no-cache,git包可加--prefer-source强制重拉。

Composer update 为什么总是不拉最新代码
因为 Composer 默认会缓存已下载的包(包括 zip 包、dist 文件、git clone 的 shallow copy),composer update 时若本地缓存命中,就跳过远程校验,导致看似“更新了”,实际用的还是旧版本或旧 commit。这不是 bug,是设计使然——但开发调试时特别碍事。
清除 vendor 目录外的全局缓存
Composer 缓存分两层:项目级(vendor/)和全局(~/.composer/cache/ 或 %LOCALAPPDATA%\Composer\cache)。删 vendor/ 只清项目依赖,不清源码来源缓存。真正要清的是后者:
- 运行
composer clear-cache—— 这是最直接的方式,会清空整个缓存目录(包括 repo、dist、archive) - 手动删缓存目录也行,但得先查位置:
composer config --global cache-dir - Windows 用户注意:
clear-cache在旧版 Composer(如 1.x)可能报错,建议升级到 2.5+ 再执行
绕过缓存强制重拉特定包
有时候只想刷新某一个库,不想清全部缓存。可以用 --no-cache 配合 require 或 update:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer update vendor/package-name --no-cache:只对该包跳过缓存,重新解析 dist/git 源 -
composer require vendor/package-name:dev-main --no-cache:尤其适合测试未发版的分支 - 注意:
--no-cache不影响 lock 文件的哈希校验逻辑,它只是让 Composer 忽略本地缓存,重新走网络请求
Git 包经常卡在旧 commit 怎么办
如果你的 composer.json 里用的是 "dev-master" 或 "dev-main",Composer 默认会对 Git 仓库做 shallow clone 并缓存 ref,下次 update 可能根本不去 fetch origin。解决方法有两个:
- 加
--prefer-source:强制每次 clone 完整仓库,再 checkout 对应 commit(适合开发中频繁变基的私有库) - 删掉
vendor/composer/installed.json和composer.lock后再composer install:逼 Composer 重新解析所有依赖来源 - 更彻底的做法:在
composer.json中为该包加"options": {"github-protocols": ["https"]},避免因 SSH key 或 token 权限导致的 fetch 失败被缓存
缓存机制本身没问题,问题常出在开发者没意识到 Composer 已经“记住了”上次的 git commit hash 或 dist URL —— 尤其当包作者 force push 或换 registry 时,这个记忆反而成了障碍。










