90%的“Package not found”是包名拼写、大小写或vendor前缀错误;其余10%源于源配置、PHP版本、缓存或包未收录。务必核对Packagist URL、repositories配置、stability及平台约束。

直接说结论:90% 的 Package not found 是包名输错、大小写不对,或漏了 vendor 名;剩下 10% 是源没配对、PHP 版本不兼容、缓存发霉,或者你真在查一个 Packagist 根本没收录的包。
包名拼写和大小写必须和 Packagist 页面 URL 完全一致
Composer 不做模糊匹配,也不自动纠错。monolog/monolog 和 Monolog/Monolog 是两个不同包,后者直接 404;spatie/laravel-backup 写成 spatie/backup 就找不到。
- 打开 https://www.php.cn/link/94953b1a99c64501ceb078724697224f(把
vendor/name换成你输的完整名字),看是否返回 404 页面 - 别从网页、聊天记录里复制包名——里面可能混入全角斜杠
/、不可见空格或零宽字符;建议在纯文本编辑器里重打一遍再粘贴 - 确认有没有漏 vendor 前缀,比如
phpunit/phpunit不能简写成phpunit
私有包或 GitHub 仓库没配 repositories 就等于不存在
Composer 默认只查 packagist.org。你指了 myorg/my-private-package,但它既没上 Packagist,又没告诉 Composer “去我公司 GitLab 或本地文件夹里翻”,那它当然报 not found。
-
repositories字段必须写在项目根目录的composer.json里,不是全局配置 - Git 类型必须是
"type": "vcs",不能写"git"或漏掉type - URL 必须是可 clone 的地址,比如
"https://github.com/username/repo.git",不能是网页链接https://github.com/username/repo - 多个源时,私有源要放在
repositories数组前面——Composer 按顺序查找,匹配即停
包存在但装不上?检查 stability、PHP 版本和镜像同步状态
你搜得到、页面能打开,composer require 却失败,大概率是约束条件卡住了。
- 运行
composer show --platform确认当前识别的 PHP 版本;再点开 Packagist 页面的 Requires 标签页,核对php和composer-plugin-api约束 - 检查项目
composer.json是否设了"minimum-stability": "stable"(默认值),而你要装的是dev-main或beta版——临时加--stability=dev试试 - 用了阿里云/腾讯云镜像?新包发布后常有数小时延迟;执行
composer config -g repo.packagist composer https://packagist.org切回官方源验证,再跑一次composer clear-cache
composer search 能搜到,require 却报 not found?这是最坑的假阳性
composer search 查的是 Packagist 全量索引,而 require 实际安装时会受三重过滤:当前项目的 minimum-stability、已锁死的 composer.lock 依赖范围、以及平台约束(PHP/扩展)。它根本不是“找不到”,而是“算出来没法装”。
- 先跑
composer show vendor/name,看是否已安装旧版本,导致新版本无法满足依赖链 - 加
-w(--with-dependencies)反而容易触发冲突:它会强制合并整个依赖树,一个小版本不兼容就直接放弃 - 不要盲目改
minimum-stability到dev—— 这是全局降级,可能连带升级几十个包,引发雪崩
真正难搞的永远不是“包在哪”,而是“为什么明明在那儿,Composer 却视而不见”。它不会告诉你卡在哪个约束上,只会甩一句 Package not found。多看一眼 composer show --platform 和 Packagist 页面的 Requires,比反复清缓存有用得多。


















