本地改代码没生效,90%是Composer未加载源码而用静态副本;需验证symlink是否生效(ls -la或dir检查),且本地包composer.json必须含"options": {"symlink": true}。

本地改了代码却没生效,90%不是代码写错了,而是 Composer 没真加载你的源码目录——它还在用缓存的副本、旧 symlink 或静态 copy。
为什么 composer update 不拉本地修改?
根本原因不是网络或权限,而是 Composer 默认复用 dist 包或 Git 快照,压根不触发重新解析。尤其用 path 仓库时,以下任一条件不满足,就会静默 fallback:
-
repositories字段必须是有效 JSON 数组(不能是空对象{},也不能混入无效源) - 本地包路径必须为绝对路径(
../my-pkg、~/pkg、./pkg/全部被忽略) - 本地包根目录下必须有合法
composer.json,且name和version与主项目require中完全一致(包括大小写) - 若版本写
"dev-main",本地包分支名必须叫main,不是master
怎么验证是否真用了 path 模式?
别只看配置,要查实际行为:
- 运行
composer show vendor/package,输出里必须含source: path /absolute/path/to/my-package - 检查
vendor/vendor/package是否为符号链接:
Linux/macOS:用ls -la vendor/vendor/package,看到->才对
Windows:用dir vendor\vendor\package,看到JUNCTION或SYMLINKD才对 - 加
-vvv运行composer update vendor/package,日志里必须出现Reading ./../my-package/composer.json,而不是Using version x.x.x from cache
清理缓存为什么 composer clear-cache 没用?
它只清 ~/.composer/cache/files/ 和部分 provider 索引,但 path 包的关键状态在别处:
- 删掉
vendor/vendor/package目录(不是整个vendor) - 手动清 Git 缓存:
rm -rf ~/.composer/cache/vcs/*(Linux/macOS)或对应 Windows 路径 - 重生成 autoload:
composer dump-autoload(改过autoload或autoload-dev后必做) - CI/Docker 中禁用
path:用真实包 +--no-cache,否则 symlink 在容器里大概率失效
类找不到?不是没装上,是 autoload 没刷新
Composer 安装 path 包时建 symlink,但不会自动重建 PSR-4 映射。哪怕 symlink 正确,新增类也可能加载失败:
- 改完本地包的
composer.json中autoload或autoload-dev后,必须跑composer dump-autoload - 如果新增的是测试类(如
tests/下),要加--dev:composer dump-autoload --dev - 检查
vendor/composer/autoload_psr4.php,确认你的命名空间已写入;没出现?说明dump-autoload没执行成功,或本地包composer.json的 autoload 配置语法错误
真正卡点往往不在“怎么配”,而在“配完有没有被读到”——path 仓库极其严格,漏一个条件就静默跳过,连 warning 都不抛。每次怀疑没生效,先 composer show + ls -la + -vvv 三连,比反复删缓存快得多。











