必须用path类型仓库实现本地包实时调试:它在Linux/macOS创建符号链接、Windows做目录映射,三处name(主项目repositories url、require字段、本地包composer.json name)须完全一致且require必须用@dev;autoload-dev的PSR-4末尾需双反斜杠,改后须手动dump-autoload --dev验证。

必须用 path 类型仓库,其他方式基本无效
直接 composer require 本地路径、手动拷进 vendor/、甚至全局 composer global require,都会导致类加载失败或代码修改不生效。真正能实时调试、自动重载、跳过版本校验的,只有 path 类型仓库——它在 Linux/macOS 下强制创建符号链接,在 Windows 下做目录映射,让 Composer 把你的本地目录当“已安装包”原地加载。
repositories 和 require 必须三处 name 完全一致
错一个字符,composer update 就报 Could not find package。要核对:
- 主项目
composer.json的repositories中url值:是相对于该文件的路径,比如"../my-package" - 主项目
require字段里写的是"my-vendor/my-package": "@dev"—— 必须用@dev,不能用*或dev-main - 本地包根目录的
composer.json中"name": "my-vendor/my-package",大小写、连字符、斜杠全部严格匹配
autoload 配置写错,测试类永远加载不到
常见错误不是 PHPUnit 问题,而是 autoload 映射断了:
-
autoload-dev的 PSR-4 映射末尾必须带反斜杠:"MyPackage\Tests\": "tests/",少一个就失效 -
tests/Http/ClientTest.php里声明namespace MyPackageTestsHttp,那映射就得是"MyPackage\Tests\": "tests/",不能写成"MyPackage\Tests": "tests/"(缺Http层级) - 无命名空间的辅助文件(如
tests/bootstrap.php)不能塞进 PSR-4,得用autoload-dev.files单独引入 - 改完
autoload-dev后,必须手动运行composer dump-autoload --dev,否则vendor/composer/autoload_dev.php不更新
验证是否真生效,别只看 vendor/ 目录
执行完 composer update my-vendor/my-package 后:
- Linux/macOS 下运行
readlink vendor/my-vendor/my-package,确认输出的是你本地包的绝对路径(说明是符号链接) - Windows 下运行
dir vendormy-vendormy-package,确认是目录映射而非复制出来的副本 - 执行
php -r "echo class_exists('MyPackage\Calculator') ? 'ok' : 'fail';",输出ok才说明生产 autoload 生效 - 再跑
php -r "echo class_exists('MyPackage\Tests\ClientTest') ? 'ok' : 'fail';",确认测试类也能加载
最易忽略的点:本地包的 composer.json 里如果漏了 type: "library",某些旧版 Composer 会静默 fallback 到 package 类型,导致 autoload 不触发;还有 Windows 用户常因路径分隔符写成正斜杠 / 而非反斜杠 ,在 url 字段中引发解析失败。


















