答案:因为composer search查的是packagist全局索引,而composer require受minimum-stability(默认只认stable)、composer.lock锁死版本及repositories是否生效三重限制;包若仅存在dev-main等非stable版本,且源未正确配置或顺序错误,composer便根本不去查找,直接报“package not found”。

为什么composer require找不到本地或私有包,但composer search能搜到
因为composer search查的是 Packagist 全局索引,而composer require实际安装时受三重限制:当前项目的minimum-stability(默认只认stable)、已锁死的composer.lock、以及repositories是否真正生效。比如包只有dev-main版本,但minimum-stability是stable,Composer 就直接跳过,报“Package not found”,而不是“版本不匹配”。
常见错误现象:
-
Could not find package vendor/name at any version—— 本质是 Composer 根本没去你配的路径找 -
Package vendor/name is not installed—— 可能装了但被当成 dist 包复制进vendor/,而非 symlink 到本地
实操建议:
- 先运行
composer show vendor/name确认是否已有旧版;若无,再执行composer require vendor/name --stability=dev --no-update临时放宽约束 - 用
composer config --list检查是否有全局repositories覆盖了项目配置 - 执行
composer -vvv require vendor/name看日志里实际尝试访问的 URL 是哪个
repositories写在哪?顺序和位置错了就等于没写
repositories必须是项目根目录composer.json的顶层字段,和require、autoload平级。写错位置(比如塞进config或extra里)会导致 Composer 完全忽略它,且不报错。
关键规则:
- 必须是数组:
"repositories": [ { "type": "path", "url": "./packages/my-lib" } ],不是对象也不是字符串 - 私有源必须放在数组最前面——Composer 按顺序匹配,一旦在
packagist.org找到同名包就终止查找 - 要显式禁用默认源:
{"packagist.org": false}必须作为repositories数组里的一个独立对象,不能合并进其他仓库配置 - 如果同时需要私有源 + 部分公开包,得手动把
{"type": "composer", "url": "https://packagist.org"}加回数组末尾
type填错一个字母,整个仓库就失效
type只接受四个硬编码值:"composer"、"vcs"、"package"、"path",大小写敏感,多空格、少字母、拼错(如"git"、"github"、"plugin")都会触发Unrecognized repository type错误。
各类型典型用法:
-
"type": "path":本地开发,url必须是相对路径(如"./packages/utils")或绝对路径(Windows 需管理员权限),不能含~或$HOME -
"type": "vcs":Git/SVN 仓库,url必须可被git ls-remote -h识别,推荐带.git后缀(如"https://git.example.com/repo.git") -
"type": "composer":私有 Packagist 服务(如 Satis),url必须以/结尾(如"https://pkg.myorg.com/"),否则请求packages.json会 404 -
"type": "package":离线单包,需手动声明name、version、dist、source等字段,不能省略
本地包vendor/name对不上?不是文件夹名说了算
Composer 匹配本地包不看文件夹名,只认包内composer.json的name字段。哪怕你把目录叫foo-bar,只要里面composer.json写的是"name": "acme/utils",你就必须require "acme/utils",而不是"foo/bar"。
容易踩的坑:
-
name必须含 vendor 名(如"myorg/http-client"),不能只写"http-client" - 大小写必须完全一致:Linux/macOS 下
"MyOrg/Http"≠"myorg/http" - 本地包目录必须已运行
git init并至少有一个 commit,否则 Composer 拒绝加载(即使有合法composer.json) - 若没打 tag,
version建议设为"dev-main",并在require中显式写"dev-main",别用"*"或"^1.0" - 安装后
vendor/acme/utils是普通文件夹而非符号链接?检查config.symlinks是否被设为false,或 Windows 是否未启用开发者模式
复杂点在于:即使所有配置都对,composer.lock里锁死的 dist URL 和源地址仍可能让install跳过新配置。改完repositories后,记得删掉composer.lock或加--ignore-platform-reqs强制重新解析源。











