composer path仓库通过符号链接实现本地包热更新:需在主项目composer.json的repositories中配置相对路径的"type":"path"源,本地包含合法name且require用"dev-main",执行composer update后改代码立即生效。

本地开发时改完包代码立刻生效,不用发版、不用推远程、不污染 composer.json
path 仓库本质是符号链接,不是复制文件
Composer 的 type: "path" 仓库在执行 composer install 或 composer update 时,不会把本地目录内容拷进 vendor/,而是创建一个指向该路径的符号链接(Linux/macOS)或硬链接(Windows)。这意味着:
- 你在
../my-local-package/src/里改一行代码,主项目里php artisan tinker一调用就走新逻辑 - 不需要
git commit → git push → composer update这套流程,迭代速度提升一个数量级 - 调试时可直接在 IDE 里跳转到本地包源码,断点、补全、重命名全部可用
它只在你本机起作用,天然隔离生产环境
只要你不把 "repositories" 里的 path 配置提交进版本控制,它就不会影响 CI/CD 或部署。但很多人踩坑是因为:
- 误把带
path的composer.json提交了,导致composer install在服务器上直接报错:Source path ../my-local-package does not exist - 用
git add .时没注意忽略临时修改,结果上线失败 - 团队成员各自配置不同路径,
composer.lock里记录的 hash 不一致,引发协作冲突
推荐做法:用 composer.json 的 require-dev + path 仅用于开发依赖;或改用 studio 工具管理,它会动态注入路径且不写入 composer.json。
和 require-dev + symlink 手动方案比,它更可靠
有人会想:我直接 ln -s ../my-local-package vendor/vendor/my-local-package 不也行?不行,因为:
- Composer 不知道这个链接存在,不会运行
autoload规则,PSR-4 映射失效 -
composer dump-autoload不会扫描它,新增类无法被自动加载 - 一旦执行
composer update,手动链接大概率被覆盖或删除 - 没有版本约束支持,
"*"或"dev-main"这类写法在纯 symlink 下无效
真正容易被忽略的是:path 仓库的路径必须是**相对于 composer.json 的相对路径**,不能用 ~/ 或 /home/user/ 这类绝对路径,否则在其他机器上即使有同名目录也无法复现。这点在团队协作或 Docker 开发中尤其关键。











