必须删锁文件、清缓存、显式重装才能切回线上包,因 composer 的 path repository 是本地优先的硬绑定机制,lock 文件会固化本地绝对路径和 symlink 信息,后续 install 不触发远程拉取。

本地用 path 包开发完,切线上版本不是改配置就能生效的——必须删锁文件、清缓存、显式重装,否则 composer install 仍会硬链接到你本地目录。
为什么 composer update 不会自动切回线上包
Composer 的 path repository 是“本地优先”的硬绑定机制。一旦你在 composer.json 里写了:"repositories": [{"type": "path", "url": "../my-package"}],并且执行过 composer update,composer.lock 就会记录这个本地路径的绝对地址(比如 /Users/me/workspace/my-package)和它的 dist 信息(实际是 symlink)。之后哪怕你删掉 repositories 或注释掉它,composer install 仍按 lock 文件还原 symlink——根本不会去 Packagist 拉包。
切换前必须确认的三件事
- 检查
composer.lock里对应包的source字段:如果值是{"type":"path","url":"...","reference":"..."},说明还没切干净 - 运行
composer show vendor/package-name,看输出里的source行是否还显示path类型 - 确认
vendor/vendor/package-name是个符号链接(ls -la看箭头指向),而不是真实目录——这是本地 path 生效的铁证
安全切换线上版本的四步操作
别跳步,顺序错了就会残留 symlink:
- 删掉
composer.json中所有repositories下的path条目(或整个repositories块) - 删除
composer.lock文件(不能只改内容,lock 文件校验强依赖完整结构) - 清空 Composer 缓存:
composer clear-cache(否则旧的 dist 包元数据可能被复用) - 重新生成锁文件并安装:
composer update --lock或直接composer install(后者会报错提示 lock 不存在,按提示走即可)
CI/CD 或部署脚本里要防的坑
很多部署脚本只做 composer install,但没清理 lock 和缓存。结果上线后 vendor 里还是本地 symlink,一重启就 404。正确做法是:
- 在部署流程开头加:
rm -f composer.lock && composer clear-cache - 确保 CI 环境中
composer.json是干净的(没有 dev-only 的path配置)——建议用.env或不同分支隔离开发/生产配置 - 不要在
post-install-cmd里写任何依赖本地路径的逻辑,那会在线上环境直接炸
最易被忽略的一点:IDE 或某些编辑器会缓存 vendor 符号链接状态,删了 lock 后不重启 IDE,它仍显示“已加载本地源”,实际运行时却是线上包——调试前先 ls -la vendor/xxx 看一眼真实路径。











