composer require 不支持直接传 git 或本地路径,需先在 repositories 中配置 path 源并确保 name 匹配,再以 vendor/name 格式安装;否则静默跳过导致“package not found”。

composer require 时输 Git 路径报 “Package not found”
这不是网络问题,是 Composer 根本没把它当路径处理——composer require 只认 vendor/name 格式,直接传 https://github.com/user/repo.git 或 ./local/path 会被当成公开包名去 Packagist 查,必然 404。
正确做法分两步:
- 先在
composer.json的repositories字段声明源类型和地址,比如本地路径要写{"type": "path", "url": "./my-package"} - 再运行
composer require user/my-package(注意仍是 vendor/name,不是路径) - 若用相对路径,确保
url是相对于composer.json所在目录的,不能含../跨出项目根(Composer 2.2+ 支持,但部分旧版本会静默忽略) -
path源默认启用symlink,即软链到vendor/;如需拷贝,加"options": {"symlink": false}
path 仓库配置后仍提示 “Package not found”
常见原因是 Composer 没识别到你配的 repositories,或者包名不匹配。它不会报“配置无效”,而是直接跳过,继续查默认源。
排查要点:
- 运行
composer config --list | grep repositories,确认输出里真有你写的repositories条目;若为空,说明配置没写进composer.json或写错位置(必须在根级,不能嵌套) - 检查
path源下的目标目录是否含有效的composer.json,且其中name字段必须与require时用的完全一致(大小写、斜杠、无空格) - 若目标
composer.json里写了"version": "dev-main",而你require时没带@dev,可能被稳定性策略过滤——加composer require user/my-package:@dev再试 - 执行
composer show -a user/my-package,如果返回空,说明当前配置下该包确实不可见
为什么 composer install 时 path 包突然“消失”
因为 composer.lock 记录的是安装时解析出的完整元数据,一旦你删了 vendor/ 或改了 repositories 配置,install 就只按 lock 文件还原——它不重新校验 path 目录是否存在或是否可读。
典型表现:
-
composer install报Package not found,但composer update却能装上 -
composer.lock里该包的source类型是dist而非path,说明上次不是从本地路径装的 - 解决方法:删掉
composer.lock和vendor/,再跑composer install;或直接composer update user/my-package强制重解析
path 仓库 + 多版本开发时的坑
一个 path 目录只能对应一个 name,但你可以通过 version 字段控制它被当作哪个版本加载。不过这个字段容易被忽略,导致依赖解析失败。
关键点:
-
path源不支持分支自动映射(不像vcs源),所有版本都靠composer.json里的version字段决定;若没写,Composer 默认视为dev-main - 若主项目要求
"user/my-package": "^1.0",而本地composer.json里写的是"version": "2.0.0",就会不匹配——要么改本地version,要么放宽主项目约束 - 修改本地
composer.json后,必须运行composer update user/my-package --no-install更新 lock 文件,否则install仍用旧版本信息
composer show -a 看得到,composer require 才可能成功。











