唯一可靠方式是声明 path 类型仓库,它强制 Composer 建立符号链接或目录映射,跳过版本解析和远程校验,使 autoload 实时指向源码;需确保 repositories 中 type 为 "path"、url 为相对路径、require 版本用 "@dev"、三处 name 完全一致、PSR-4 映射末尾带反斜杠、autoload-dev 修改后运行 composer dump-autoload --dev,并通过 readlink/dir 和 class_exists() 验证生效。

必须用 path 类型仓库,其他方式基本无效
直接 composer require 本地路径、手动拷贝进 vendor/、甚至用 vcs 指向本地 Git 仓库——这些都会导致类加载失败、改代码不生效、composer dump-autoload 无反应。唯一可靠的方式是声明 path 类型仓库,它强制 Composer 建立符号链接(Linux/macOS)或目录映射(Windows),跳过版本解析和远程校验,让 autoload 实时指向你的源码。
关键点:
-
repositories中type必须为"path",不能是"vcs"或"package" -
url是相对于主项目composer.json的路径,比如本地包在上层目录:"../my-package" -
require中版本约束必须用"@dev",写"*"或"dev-main"都可能被忽略
name 字段三处必须完全一致
报错 Could not find package "xxx/yyy",90% 是因为三个地方的 name 对不上:
- 本地包根目录的
composer.json里"name": "xxx/yyy" - 主项目
composer.json的require字段:"xxx/yyy": "@dev" - 主项目
repositories的url路径下,该包的composer.json确实存在且内容正确
大小写、斜杠方向、连字符都不能错。例如 "myorg/my-pkg" 和 "myorg/my_pkg" 是两个不同包。
autoload 和 autoload-dev 配置必须带尾部反斜杠
测试类加载失败、class_exists() 返回 false,大概率是 PSR-4 映射末尾少了个 :
- 正确:
"MyPackage\": "src/"、"MyPackage\Tests\": "tests/" - 错误:
"MyPackage\": "src"(缺斜杠)、"MyPackage\Tests": "tests/"(Tests 后没反斜杠) - 无命名空间的辅助文件(如
tests/bootstrap.php)必须用autoload-dev.files单独引入,不能塞进 PSR-4 - 改完
autoload-dev后,必须手动运行composer dump-autoload --dev,否则vendor/composer/autoload_dev.php不更新
验证是否真生效,别只看 vendor/ 目录
执行 composer update xxx/yyy 后,立刻检查底层链路:
- Linux/macOS:运行
readlink vendor/xxx/yyy,输出应是绝对路径,不是空或普通文件 - Windows:运行
dir vendorxxxyyy,确认是目录映射而非复制出的副本 - 测试生产 autoload:
php -r "echo class_exists('MyPackage\Calculator') ? 'ok' : 'fail';" - 测试开发 autoload:
php -r "echo class_exists('MyPackage\Tests\CalculatorTest') ? 'ok' : 'fail';"
只要其中任一 class_exists() 返回 fail,就说明 autoload 配置或路径映射还没通——此时跑 PHPUnit 一定失败,不用往下试。


















