“Package not found”主因是源未生效或约束冲突:repositories中packagist.org未禁用、私有源配置错位、minimum-stability过滤dev版、VCS URL不合法,或-w参数引发依赖解析失败。

“Package not found”不是网络问题,也不是缓存没清干净——它意味着 Composer 根本没在你预期的地方找包;依赖冲突也不是版本写错了那么简单,而是约束系统明确拒绝了所有可行解。
composer require 报 “Package not found” 怎么快速定位
这个错误出现时,Composer 已经完成了源发现阶段,但没匹配到任何满足条件的包。常见诱因不是拼错名字,而是配置没生效或约束卡死了:
- 运行
composer config repositories,确认输出里是否还包含https://repo.packagist.org——只要它还在,私有源或镜像再靠前也白搭 - 私有源必须用独立对象关闭官方源:
{"packagist.org": false}要作为repositories数组的**最后一个元素**,不能嵌套、不能写成"packagist": false -
composer search vendor/name能搜到 ≠ 你能装——它只查 Packagist 全局索引,不校验minimum-stability、PHP 版本或你的repositories配置 - 包只有
dev-main版本?默认"minimum-stability": "stable"会直接跳过,报 “not found”,而不是 “no matching version” - VCS 类型仓库(如 Git)必须写
"type": "vcs",URL 必须是可git clone的地址,且结尾只能是.git,不能带分支或路径(如#main或/tree/main)
为什么加了 -w(--with-dependencies)反而找不到包
-w 不是“更用力安装”,它是让 Composer 强制把当前项目所有已安装包的依赖树全部拉进来,再尝试合并新包的约束。一旦某个已有包锁定了老版本子依赖,而你要装的包要求更高版本,Composer 就会放弃整个解析,返回模糊的 “Package not found”。
- 去掉
-w重试:composer require vendor/name(不带参数) - 必须用
-w?先跑composer update --dry-run看冲突点在哪,别等报错才查 - 旧版 Composer(-w 的处理更激进,建议升级到 Composer 2.x
- 某些镜像(如阿里云)同步有延迟,新发布的包可能还没入库——临时切回官方源验证:
composer config -g repo.packagist composer https://packagist.org
依赖冲突真正在拦路的是谁:用 why-not 定位源头
报错里那句 don't install laravel/framework v10.45.0 是结果,不是原因。真正要查的是谁在封杀它。
- 运行
composer why-not laravel/framework:10.45.0(必须带完整补丁号,如10.45.0,不是^10.45) - 输出从下往上读:最后一行是你
composer.json的根声明,往上每行required by就是一个拦路者 - 输出为空?说明该版本不在任何
require或conflict列表中——大概率是minimum-stability过高,或版本号写错 -
require-dev包全程参与解析(从 Composer 1.7 开始),别忽略phpunit/phpunit或orchestra/testbench拖着老版sebastian/exporter锁死symfony/console
私有包和 VCS 仓库配置最容易静默失败
Composer 对 repositories 配置极其严格:错一个字段,就静默忽略整条,继续走默认源。它不会报错,只会让你反复撞墙。
- VCS 仓库必须写
"type": "vcs",写成"git"、"github"或漏掉,整条配置被忽略 - 目标仓库根目录的
composer.json中name字段,必须与composer require时写的 **完全一致**(包括大小写) - 自定义 Composer 源(如私有 Packagist)URL 必须可访问,且返回的元数据格式合法;可用
curl -I https://pkg.myorg.com/packages.json看 HTTP 状态码 - 别用
composer config --global repos.packagist false——这是全局污染,其他项目会崩 - 如果
composer show vendor/name显示 “No package found”,但你知道它存在,说明repositories没生效,或者该包没发布到你配的源里
最常被忽略的一点:Composer 查包是「从上到下,命中即停」,但这个逻辑**只在 {"packagist.org": false} 显式启用后才生效**。否则它永远先查官方源兜底——哪怕你写了十个私有源,也全作废。


















