必须用path类型仓库,因其强制符号链接、跳过版本校验、确保autoload实时生效;其他方式均导致类加载失败或修改不生效。

本地包必须用 path 类型仓库,其他方式都不可靠
Composer 构建时加入本地包进行调试,唯一稳定可行的方式是使用 type: "path" 仓库。任何试图用 composer require vendor/name:@dev 指向 Git 仓库、手动拷贝进 vendor/、或用全局 composer global 的做法,都会导致修改不生效、autoload 断链、或测试时类找不到。
原因很简单:path 类型强制 Composer 把本地目录当“已安装包”处理,跳过远程解析和版本校验,同时支持 symlink(符号链接)机制——这才是热更新的基础。
-
repositories中必须显式写"type": "path",不能省略 -
url必须是相对路径(如"../my-package")或绝对路径(如"/Users/me/my-package"),不能带file://或~ - 该路径必须直接指向含合法
composer.json的目录,末尾不能加/ - Windows 下路径不能含中文或空格,某些 PHP 版本会静默失败
name 和路径必须逐字节一致,大小写错一个就失败
90% 的 Could not find package 错误,根源都在 name 字段不匹配。Composer 不做模糊匹配,它严格比对 require 中的字符串和本地包 composer.json 里的 name 值——包括大小写、分隔符(只认短横线 -,不用下划线 _ 或驼峰)、vendor 名全部对齐。
- 主项目
require写的是"acme/utils": "@dev",那本地包的composer.json里就必须是"name": "acme/utils",不能是"Acme/Utils"或"acme_utils" -
url是相对于主项目composer.json文件的位置,不是你当前终端所在目录 - 验证方法:执行
composer show --all | grep acme/utils,如果没输出,说明 name 或路径没对上
想改代码立刻生效,symlink 必须启用且成功创建
所谓“热更新”,本质是 vendor/acme/utils 指向你的本地目录。但 Composer 默认尝试 symlink,失败就静默 fallback 到 copy 模式——这时你改本地代码,vendor/ 里还是旧副本,调试完全失效。
- 必须在主项目
repositories条目中加"options": {"symlink": true}(不是写在本地包自己的composer.json) - 本地包目录需已
git init并至少有一个commit,否则 Composer 拒绝 symlink - Windows 用户必须以管理员身份运行终端;Docker 需加
--cap-add=SYS_ADMIN并挂载支持 symlink 的卷 - 验证是否成功:
ls -la vendor/acme/utils(macOS/Linux)应显示->箭头;Windows 上dir vendorcmeutils应看到<symlinkd></symlinkd>
autoload 生效要手动触发,别指望 composer install 自动搞定
即使 symlink 成功,类仍可能报 Class not found。这不是 Composer 没加载包,而是 autoload 映射没包含你本地包的真实路径。
- 确保本地包
composer.json中autoload和autoload-dev的 PSR-4 映射正确,例如"MyPackage\": "src/",末尾反斜杠不能少 - 改完 autoload 配置后,必须手动运行
composer dump-autoload --dev(开发依赖)或composer dump-autoload -o(优化模式) - 验证 autoload 是否真通:
php -r "echo class_exists('MyPackage\Calculator') ? 'ok' : 'fail';"输出ok才算过关 - 如果用了
tests/bootstrap.php这类无命名空间文件,得用autoload-dev.files单独引入,PSR-4 不管用











