Composer link包重命名后vendor仍为旧路径,因link仅建符号链接且不感知源目录变更;需先composer unlink,再确保本地包name字段更新并用新路径重新link,最后dump-autoload重建映射。

composer link 的包重命名后 vendor 目录里还是旧路径
这是因为 composer link 只在 vendor/ 下创建符号链接,不修改其目标路径或自动感知源目录的重命名。一旦你把本地包目录从 ../my-package 改成 ../my-new-package,vendor/vendor/name 仍指向原路径,而该路径已不存在,导致 autoload 失败或 Class not found。
修复必须分两步:先解除旧链接,再用新路径重建。不能跳过 unlink 直接 link,否则会报 Cannot create symbolic link: File exists。
- 进主项目根目录,执行
composer unlink vendor/name(注意不是composer link --unlink) - 确认本地包目录已重命名且含合法
composer.json - 进新本地包目录,运行
composer link(需 Composer 2.4+ 或已装composer-plugin-link) - 回到主项目,运行
composer link vendor/name,此时链接将指向新路径
重命名后 composer dump-autoload 无效?
是的,composer dump-autoload 只刷新类映射,不修复符号链接本身。如果 vendor/vendor/name 是个断链(dangling symlink),PHP 自动加载器根本不会走到扫描那一步——它连目录都打不开,直接抛 Warning: require(): failed to open stream。
验证是否为断链:运行 ls -la vendor/vendor/name,若显示 broken 或路径红字,说明链接目标不存在。
- 别在断链状态下跑
dump-autoload,徒劳无功 - 先用
rm vendor/vendor/name手动删掉断链(composer unlink有时不彻底) - 确保新本地包的
composer.json中"name"字段已同步更新,否则composer link vendor/name会找不到匹配项 - 重链后立即跑
composer dump-autoload,确保新路径下的类被纳入 PSR-4 映射
为什么改了本地包名,composer update 反而把软链接干掉了
因为 composer update 默认按 composer.lock 还原,而 lock 文件里记录的是原始包名和版本(如 "dev-main"),它并不知道你手动建了软链接。一旦执行 update,Composer 发现 lock 里要求的是一个“远程可安装包”,就会把 vendor/ 下的符号链接替换成真实 zip 解压目录。
- 永远不要对已
link的包执行composer update vendor/name,这是最常见误操作 - 如果已经发生,别急着重链,先检查
composer.lock里该包的source类型是否还是"type": "path"—— 若已变成"type": "zip",说明 path 仓库配置可能被覆盖或失效 - 恢复方式:删掉
vendor/vendor/name,重新加回repositories块并确保require写的是"dev-main",再跑composer update vendor/name --with-dependencies
重命名后 autoload.php 里还留着旧路径怎么办
这是缓存残留。Composer 生成的 vendor/autoload.php 会把所有 PSR-4 映射硬编码进 autoload_psr4.php,如果旧包路径曾被扫描过,映射可能还在,导致 PHP 加载错误文件。
最稳妥的清理方式不是只跑 dump-autoload,而是强制重建整个 autoload 体系:
- 删掉
vendor/composer/autoload_*.php全部文件(autoload_static.php、autoload_classmap.php等) - 删掉
vendor/composer/installed.php和installed.json(它们记录的是已安装包元数据,含旧路径) - 再执行
composer dump-autoload --optimize,让 Composer 重新扫描当前vendor/和所有 path 仓库下的有效包 - 若用 Laravel,顺手跑
php artisan config:clear避免框架缓存 autoload 路径
重命名本地包不是改个文件夹名就完事,关键在三处同步:目录名、composer.json 里的 name、以及 composer link 的目标路径。漏掉任意一环,都会让 autoload 在某个环节静默失败,而不是报明确错误。











