Composer报“Package not found”主因是repositories配置未生效:packagist.org未禁用、顺序错误、VCS URL不合法或path源路径格式不对;search仅查全局索引,require则严格按配置源+stability+元数据匹配。

Composer报“Package not found”但包明明存在?先确认它是否真被识别
不是所有“存在”的包 Composer 都会去查——它只按 repositories 配置的顺序、生效状态和元数据可读性来决定查哪、怎么查。静默跳过是常态,不报错才是最坑的。
常见现象:composer search vendor/name 能搜到,composer require vendor/name 却报 404;或者本地 path 包配置好了,composer install 却说找不到。
- 运行
composer config repositories,确认输出里有你配的源,且{"packagist.org": false}是独立对象、位于数组末尾 - 若用的是 path 类型仓库,
url必须以./或../开头,写成"my-package"或"/home/user/pkg"会被完全忽略 - 若用的是 vcs(Git/GitLab),
url必须是能git clone的地址,结尾不能带#main或路径,只能是.git结尾 - 私有 Git 仓库要确保
auth.json存在且含有效 token;URL 中不要出现@username,否则认证被跳过
分支别名(branch-alias)为什么必须手动加?dev-main 不等于 1.0.x-dev
Composer 对 dev-main 这类分支名不做自动语义映射。它只是个“快照标记”,不代表版本号。没有 branch-alias,你就只能写死 "dev-main",无法用 "^1.0" 或 "1.0.*@dev" 这种更安全的约束。
别指望下游项目自动理解你的分支意图——这个映射必须由包维护者在**被 require 的那个包自己的 composer.json** 里声明。
- 正确写法(放在本地包的
composer.json中):{ "extra": { "branch-alias": { "dev-main": "1.0.x-dev" } } } - 错误写法:把
branch-alias写进主项目的composer.json—— 它只对当前项目自身生效,不影响依赖包解析 - 分支别名只影响版本约束匹配,不影响安装行为;没设别名也能装
dev-main,但下游项目升级时极易锁死或冲突 - 如果包还没发版,又想让别人用稳定语法引用,必须加别名;否则别人只能硬写
"dev-main as 1.0.x-dev",极不友好
require dev 分支却失败?检查三件事:分支是否存在、是否 git init、name 是否一致
报 Could not find package,大概率不是网络或镜像问题,而是 Composer 根本没进入“拉取”阶段——它卡在元数据读取环节就放弃了。
- 本地 path 包目录必须已执行
git init且至少有一个 commit,否则 Composer 拒绝识别(连composer.json都不读) - 本地包的
composer.json中name字段必须和主项目require的完全一致:大小写、vendor 名、斜杠、连字符一个都不能错 - require 时必须用
dev-xxx形式,比如"acme/utils": "dev-main";写成"acme/utils": "main"或"acme/utils": "1.0.0"都会失败 - 分支名含特殊字符(如
feature/login-v2)时,必须写成dev-feature/login-v2,不能省略dev-前缀
为什么改了 repositories 还是 not found?优先级和缓存比你想象中更顽固
Composer 的源查找逻辑很“固执”:只要 packagist.org 没被显式关掉,它永远先查官方源;只要项目级 composer.json 里有 repositories 字段(哪怕空数组),它就屏蔽全局镜像。
- 检查是否误用了旧键名:
composer config -g repos.packagist(注意是repos复数);repo.packagist在 Composer ≥2.2 中已失效 - 项目根目录下若有
composer.json含"repositories": [],会覆盖全局配置,此时需运行composer config repo.packagist(不加-g)确认项目级设置 - 换源后必须执行
composer clear-cache,否则仍用旧元数据;更彻底的做法是composer update --refresh强制重载远程 packages.json - 别信
composer show vendor/name的输出——它只显示已安装的包;要用composer depends vendor/name或composer require vendor/name --dry-run看真实解析路径











