根本原因是 symlink 指向旧目录、autoload 未重建、VCS 元数据缓存未清除;需依次删除 vendor/package 符号链接、~/.composer/cache/vcs/ 快照、vendor/composer/autoload_*.php,再执行 composer update --no-cache --with-all-dependencies。

软链接没更新、类找不到、本地包修改不生效——根本不是 Composer 没装上,而是 symlink 指向旧目录、autoload 没重生成、缓存元数据还在用快照。
path 仓库下本地包修改不生效?先确认 symlink 和 source 是否真实生效
Composer 对 path 类型仓库的处理是:首次安装时创建 vendor/vendor/package 到本地路径的符号链接,并缓存该路径的元数据(包括 composer.json 内容和 autoload 规则)。后续 composer update 默认跳过它,除非元数据被强制刷新。
- 运行
composer show vendor/package,输出中必须含source: path ../my-package,否则说明repositories配置未加载(常见于"repositories": {}或含无效 type) - 检查本地包根目录是否有
composer.json,且name和version(如"dev-main")与主项目require中声明完全一致 - Linux/macOS 下验证 symlink 是否指向正确路径:
ls -la vendor/vendor/package;Windows 用户注意 PowerShell 不支持原生 symlink,需用cmd或启用开发者模式
为什么 composer clear-cache 没用?它不碰 symlink 和 VCS 快照
composer clear-cache 只清理 ~/.composer/cache/files/(ZIP 包)和部分 vcs/(Git clone),但 path 包的 symlink 是硬写在 vendor/ 里的,元数据快照还存在 ~/.composer/cache/vcs/ 子目录中,autoload 更是完全独立生成的。
- 必须手动删掉
vendor/vendor/package目录(不是整个vendor),否则 symlink 一直指向旧位置 - 删 Git 缓存快照:
rm -rf $(composer config --global cache-dir)/vcs/*(Linux/macOS);Windows 对应路径为%APPDATA%\Composer\Cache\vcs\ - 加
-vvv运行composer update vendor/package --no-cache,日志里必须出现Reading ./../my-package/composer.json,而非Using version x.x.x from cache
Class not found?autoload 没重建,不是包没装
symlink 更新了,但 vendor/autoload.php 仍按旧 composer.json 的 autoload 字段生成规则加载——哪怕你改了本地包的 PSR-4 命名空间或加了新文件,也不会自动生效。
- 必须显式触发 autoload 重建:
composer dump-autoload(开发环境)或composer install --optimize-autoloader(生产) - 如果本地包的
autoload从psr-4改成了classmap,旧 autoload 文件不会感知变化,必须删掉vendor/composer/autoload_*.php后再 dump - CI/CD 或 Docker 构建中禁用
path仓库:它只适合本地开发;上线前应改回真实 Packagist 版本,并确保composer.lock已提交
强制刷新 + 重装的最小安全操作集
想让一次 update 真正反映本地修改,不能只靠参数,得切断 symlink、元数据、autoload 三处缓存链。漏掉任意一个,都会“看起来更新了,实际还是老代码”。
- 删 symlink:
rm -rf vendor/vendor/package - 清 VCS 快照:
rm -rf $(composer config --global cache-dir)/vcs/* - 删 autoload 缓存:
rm -f vendor/composer/autoload_*.php - 重装并重建:
composer update vendor/package --no-cache --with-all-dependencies
真正难调试的永远不是命令输错,而是你以为删了缓存,其实 symlink 还钉在那儿,autoload 还按三个月前的配置跑着。


















