path仓库的versions字段必须显式声明包名和版本,每个条目需含name、version及dist/source字段,name大小写敏感,version须精确匹配如"dev-main",dist.url需为可下载tarball地址。

path仓库的versions字段必须显式声明包名和版本
Composer 的 path 类型仓库不自动扫描目录或解析 Git 分支,它只认你手动写进 versions 数组里的条目。漏写、拼错 name 或 version,composer require 就会报 Could not find package,哪怕路径下真有 composer.json。
-
versions是一个数组,每个元素必须是完整对象,含name、version和dist(或source)字段 -
name必须与require中写的完全一致(大小写敏感),例如"acme/utils"≠"Acme/Utils" -
version可以是语义化版本(如"1.2.3")、分支别名(如"dev-main"),但不能是"main"或"v1.2.3"(多数包不带v前缀) -
dist.url必须指向可直接下载的 tarball(如file:///absolute/path/to/pkg.tar.gz),不能是目录路径
为什么用 path 仓库还要配 dist.source?
path 类型本质是“本地文件系统映射”,但 Composer 安装时默认走 dist 方式(解压归档),不是 source(git clone)。如果你只写 source,composer install 会失败,提示 No zip extension installed 或静默跳过。
- 推荐始终提供
dist:用tar -czf打个包,填dist.type: "tar"+dist.url(支持file://协议) - 若坚持用源码方式(比如要调试修改),必须加
"preferred-install": {"acme/utils": "source"}到项目composer.json的config段 -
source字段里url填相对路径(如"../acme-utils")会被解析为相对于当前项目根目录,不是相对于composer.json文件位置
path 仓库和 vcs 仓库混用时的优先级陷阱
当你同时配置了 path 和 vcs 两种类型指向同一个包名,Composer 默认以 path 为准——但这只在 require 阶段生效;一旦 composer.lock 生成,后续 install 会严格按 lock 文件里的 source.type 拉取,可能绕过你改的 path 配置。
- 验证是否真走 path:运行
composer show acme/utils,看输出里source行是否显示type : path - 如果仍走 vcs,检查
composer.lock是否残留旧记录——删掉vendor/、composer.lock,再跑composer install - CI 环境中
path仓库基本不可用(路径不存在),建议只用于本地开发,上线前用package或vcs替代
versions 数组里写 dev-main 却报 no matching package found
dev-main 不是 magic 字符串,它要求 versions 条目里 version 字段必须精确等于 "dev-main",且对应目录下的 composer.json 中 name 字段与之匹配。任何偏差都会导致匹配失败。
- 错误写法:
"version": "main"、"version": "dev-master"(除非你真有 master 分支)、"version": "dev-main@dev" - 正确写法:
"version": "dev-main",且目标目录composer.json中"name": "acme/utils"与 require 完全一致 - 想让
dev-main被识别为稳定版?在项目composer.json加"minimum-stability": "dev",否则默认只认stable版本
path 配置后,立刻跑一次 composer require acme/utils:dev-main --dry-run 验证路由是否通。











