vendor中symlink指向旧代码,因Composer不监听源目录变更;需删对应包目录、执行composer update --no-cache、再dump-autoload,且本地包composer.json须配"options":{"symlink":true}并完成git init和首次提交。

Composer共享依赖的缓存不会自动同步更新,必须手动清理并重建 autoload 映射,否则本地修改、类新增或路径变更都不可见。
为什么 vendor 里的 symlink 指向了旧代码?
path 类型仓库(如 "repositories": [{"type": "path", "url": "../my-package"}])下,Composer 会在 vendor/ 创建符号链接,但不会监听源目录变更。一旦你改了类名、加了新文件,或切换了分支,vendor/ 下的 symlink 不会自动刷新,autoload 也不会重生成。
- 运行
composer show vendor/package,输出中必须含source: path ../my-package,否则配置根本没生效 - 删掉
vendor/vendor/package目录(不是整个vendor),再跑composer update vendor/package --no-cache - 必须同步执行
composer dump-autoload,否则新增类仍报Class not found
缓存清理要分三层:vcs、files、vendor symlink
composer clear-cache 只清 ~/.composer/cache/files/ 和部分元数据,对 path 包完全无效。Git clone 快照、symlink 指向、autoload 规则三者都可能残留旧状态。
- 删 Git 缓存:
rm -rf ~/.composer/cache/vcs/*(Linux/macOS)或对应 Windows 路径 - 删 vendor 中的 symlink:
rm -rf vendor/vendor/package - 验证是否真重载:加
-vvv运行,日志里应出现Reading ./../my-package/composer.json,而不是Using version x.x.x from cache
CI/CD 或 Docker 中 path 仓库必须禁用
path 仓库只适用于本地开发。在 CI/CD 流水线或容器构建中,../my-package 路径不存在,会导致安装失败或静默回退到 packagist 上的旧版本。
- CI 配置中应移除
repositories字段,或用条件判断屏蔽它 - Dockerfile 中不要复制本地包目录进容器来“模拟” path;应发布真实 dev 版本到私有仓库,再
require - 若必须调试,可在 CI 前临时替换为
composer config repositories.0.type composer并指向内部镜像
autoload 更新失败的典型表现与修复
类存在但 Class not found,或 dump-autoload 后仍加载不到新文件,往往不是 Composer 没装上,而是 autoload 规则未覆盖新路径。
- 检查
vendor/composer/autoload_psr4.php是否包含你新增的命名空间映射 - 确认本地包
composer.json的autoload.psr-4键值正确,且路径相对于其根目录(不是项目根目录) - 加
--optimize-autoloader参数重跑:composer dump-autoload --optimize-autoloader,强制重建 classmap
最易被忽略的是:path 包的 composer.json 中 name 和 version 必须与主项目 require 字段严格一致;写 "dev-main" 就必须保证本地包当前分支是 main,不是 master 或 develop。











