Composer path仓库require失败主因是name或路径不匹配:name须大小写及短横线完全一致,url须为不含尾斜杠的合法绝对或相对路径,且指向含有效composer.json的目录。

path仓库配置后require失败,先确认name和路径是否完全匹配
Composer 对 path 类型仓库的 name 和 url 是严格字面匹配的,大小写、分隔符(只认短横线 -)、斜杠方向、末尾是否带 / 全部算在内。比如你在主项目 composer.json 的 repositories 里写了:"url": "../my-pkg/",它就会静默忽略整个仓库——因为末尾的 / 导致路径解析失败。
实操建议:
- 用
ls -ld ../my-pkg(Linux/macOS)或dir ..my-pkg(Windows CMD)确认该目录真实存在,且是相对于主项目composer.json的位置 - 打开本地包根目录下的
composer.json,检查name字段值(如"acme/utils"),必须和主项目require中写的完全一致,不能是"Acme/utils"或"acme_utils" - 确保本地包
composer.json语法合法:无尾逗号、全双引号、JSON 格式有效(可用php -l composer.json快速验证)
symlink没生效?检查本地包自己的options配置
path 仓库默认尝试创建符号链接,但失败时会静默 fallback 到复制(copy)模式。你改了本地源码,vendor 里还是旧副本,根本原因不是主项目配错了,而是本地包自己的 composer.json 缺了 "options": {"symlink": true}。
实操建议:
- 在本地包(即
url指向的那个目录)的composer.json根对象里,显式加上"options": {"symlink": true} - Windows 用户必须以管理员身份运行终端;Docker 容器需加
--cap-add=SYS_ADMIN并挂载宿主机目录(非 volume) - 验证是否真用了 symlink:
ls -la vendor/acme/utils(Linux/macOS)看到箭头指向源目录才算成功;Windows 用dir vendorcmeutils看是否为JUNCTION
autoload不生效,不是没装上,而是映射没更新
即使 composer show acme/utils --path 能正确输出路径,new AcmeUtilsHelper() 仍报 Class not found,大概率是 autoload 映射没包含本地包的真实路径。
实操建议:
- 确认本地包
composer.json中有合法的autoload声明,例如:"psr-4": {"Acme\": "src/"} - 主项目执行
composer dump-autoload -o(注意加-o,否则优化 autoload_static.php 不会重生成) - 别依赖 IDE 自动索引——某些 IDE 会缓存旧路径,重启 IDE 或手动刷新索引
- 检查 Web 入口文件中
require的是不是新 vendor 下的autoload.php,路径错一个字符就全崩
为什么 composer depends acme/utils 查不到?它根本不查未安装项
composer depends 只扫描当前项目已安装进 vendor/ 的包,以及 composer.lock 中记录的依赖关系。如果你刚配好 path 仓库但还没运行 composer install 或 composer require acme/utils,它就什么也查不到。
实操建议:
- 先确保本地包已通过
composer install成功落地到vendor/acme/utils(用composer show acme/utils --path验证) - 若只在
require-dev里,加--link-type=require-dev才能查到 - 想跨项目查谁用了它?别指望原生命令——直接
grep -r '"acme/utils"' /path/to/projects/ --include="composer.json"
composer dump-autoload -o。autoload_static.php 不更新,类就永远找不到。











