composer repositories 是 composer.json 中用于扩展包搜索范围的配置项,不是替代 require 或自动拉取代码的机制;需按顺序配置多个仓库,私有仓库置前、公共镜像置后,packagist.org 禁用项必须单独成数组元素且建议放最后。
composer
repositories 是什么,不是什么
是
里的一个配置项,用来告诉 Composer:「除了 packagist.org,我还从这些地方找包」。它不替代
,也不自动拉取代码——只是扩展了包的搜索范围。很多人误以为配了就能直接
,结果报
,其实是没搞清:包必须在你配的某个仓库里真实存在,且
和
能被解析到。
怎么写多个仓库,顺序很重要
多个仓库用数组写,顺序决定优先级:Composer 会从上到下依次查找,找到第一个匹配的就停。所以私有包仓库要放前面,公共镜像(比如阿里云镜像)放后面兜底。
常见错误是把 packagist.org 的禁用和自定义仓库混在一起写错位置:
上面这段会报错,因为
不是合法仓库对象。正确写法是单独一项:
必须是数组中的一项,且建议放在最后(否则它会提前截断查找):
每个仓库对象必须有
字段,常见值:
、
、
是特殊语法,不是仓库,不能带其他字段
所有
类型仓库的
必须以
结尾(如
),否则
可能静默失败
vcs 仓库为什么经常拉不到 dev-main
用
指向 Git 仓库时,Composer 默认只识别带稳定版本号的 tag(如
),不会自动把
或
分支当
处理——除非你在
里明确写死分支名。
Composer 2.9.6
Composer 2.9.6 是 PHP 生态中高效、稳定的依赖管理工具。此版本在性能与兼容性上进一步优化,改进了依赖解析算法,提升大型项目中的安装与更新速度。它支持并行下载任务,显著减少等待时间,并增强了与私有仓库及镜像源的交互稳定性。同时修复了多项命令行交互与内存使用相关的缺陷,确保在复杂依赖关系下依然可靠运行。无论是新项目初始化还是现有系统维护,Composer 2.9.6 都能为开发者提供流畅、精准的依赖管理体验。
下载
常见现象:
报
,但
能通。
确认 Git 仓库根目录有
,且
字段和
里写的完全一致(包括大小写)
分支名必须加
前缀才能被识别,
→
,
→
如果要用
,确保该分支的
中
字段要么不存在,要么设为
;设成
反而会被忽略
VCS 仓库不支持按路径过滤,整个仓库的所有分支/Tag 都会被索引,可能拖慢
私有 Composer 仓库(type: composer)的最小可用配置
如果你搭了 Satis 或 Private Packagist 这类服务,
是最常用方式。但它不像 VCS 那样“即插即用”,依赖服务端生成的
。
最容易被忽略的是:服务端返回的元数据必须包含完整包信息,且路径可公开访问。本地测试时,常因 Nginx 未配
或缺少
fallback 导致 404。
必须指向含
的目录,例如
,而不是
服务端响应头需包含
,否则 Composer 解析失败,报错类似
如果服务启用了 Basic Auth,必须在
里写成
,Composer 不会弹认证框
运行
后再
,否则旧缓存可能掩盖配置生效问题
多仓库场景下,最麻烦的永远不是怎么写,而是哪个仓库悄悄覆盖了你的预期版本——尤其当两个仓库都提供同名包时,靠位置顺序和稳定性标记(stable vs dev)来博弈,得盯紧
的输出。
repositoriescomposer.jsonrequirecomposer require vendor/nameCould not find packagenameversion
{
"repositories": [
{
"type": "vcs",
"url": "https://git.example.com/my-private-package"
},
{
"type": "composer",
"url": "https://mirrors.aliyun.com/composer/"
},
{
"packagist.org": false
}
]
}{"packagist.org": false}{"packagist.org": false}typevcscomposerpackage{"packagist.org": false}composerurl/https://repo.example.com/composer installtype: "vcs"v1.0.0maindevelopdev-mainrequirecomposer require myorg/mylib:dev-mainCould not find packagegit clonecomposer.jsonnamerequiredev-maindev-mainnextdev-nextdev-maincomposer.jsonversion"dev""1.0.0"updatetype: "composer"packages.jsontry_filesindex.phpurlpackages.jsonhttps://packages.myorg.com/https://packages.myorg.com/packages.jsonContent-Type: application/jsonfile could not be downloaded: failed to open streamurlhttps://user:pass@packages.myorg.com/composer clear-cacheupdatecomposer show -a vendor/name