必须使用 path 类型仓库,因其通过符号链接或目录映射直连源码,跳过 Git 克隆与缓存,确保 autoload 实时生效;三处 name 和路径须严格一致,autoload-dev 的 PSR-4 末尾需双反斜杠,且必须执行 composer dump-autoload --dev 验证。

必须用 path 类型仓库,其他方式基本都失效。 直接拷进 vendor、用 composer require 加本地路径、甚至 git@localhost 都会断 autoload 或不响应代码修改——这不是配置问题,是 Composer 的设计机制决定的。
为什么只能走 path 仓库?
Composer 对本地包的实时开发支持,只通过 path 类型仓库实现。它在 Linux/macOS 下强制创建符号链接,在 Windows 下做目录映射,跳过版本解析、跳过 Git 克隆、跳过缓存校验,让 autoload 直接指向你正在编辑的源码目录。
-
composer require vendor/name:@dev+vcs仓库:仍走 Git clone,改代码必须 commit + push 才生效 - 手动复制到
vendor/:Composer 不认这个路径,dump-autoload无效,Windows 下还会静默 fallback 成 copy -
global require:脱离项目上下文,phpunit跑不起来,config/app.php也注册不上
三处 name 和路径必须严格对齐
错一个字符,composer update 就报 Could not find package。重点核对这三点:
- 主项目
composer.json的repositories中url值:是相对于该文件的路径,比如写"../my-package",就表示上一级目录下的my-package文件夹 - 主项目
require里写的是"my-vendor/my-package": "@dev"—— 必须用@dev,不能用*或dev-main - 本地包根目录的
composer.json中"name": "my-vendor/my-package":大小写、连字符、斜杠全部一致,少一个都匹配失败
autoload 配置写错,类就永远加载不到
测试类报 Class not found,90% 是 autoload-dev 没写对,和 PHPUnit 无关。
-
autoload-dev的 PSR-4 映射末尾必须带反斜杠:"MyPackage\Tests\": "tests/",少一个就断掉 - 如果
tests/Http/ClientTest.php里声明namespace MyPackageTestsHttp,那 autoload-dev 就不能写成"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 的,不是相对当前 shell 目录;@dev 是唯一能触发 path 仓库行为的约束;dump-autoload --dev 不是可选操作,是必做步骤。


















