path仓库必须在主项目composer.json的repositories数组中定义,且需满足type为"path"、url为合法本地路径、路径下有含name和version字段的composer.json三个条件,否则Composer静默忽略。

path仓库必须写在主项目composer.json的repositories数组里
Composer 不会自动扫描你电脑上任意目录,它只认主项目根目录下的 composer.json 里 repositories 数组中明确定义的源。把 repositories 塞进本地包自己的 composer.json,或者丢到全局 config 里,完全无效。
正确写法是:在主项目根目录的 composer.json 中添加一个 type: "path" 条目,且必须是数组形式:
"repositories": [
{
"type": "path",
"url": "./packages/my-utils"
}
]
常见错误现象包括:composer require myorg/utils 报 Could not find package,但 composer config --list | grep repositories 根本不显示你配的源——说明配置压根没被加载。
url必须是合法本地路径,且目标目录要有完整composer.json
path 类型仓库有三个硬性前提,缺一不可,否则 Composer 静默忽略,连 warning 都不抛:
-
type必须严格写成"path"(小写,大小写敏感) -
url必须是本地绝对路径或以./开头的相对路径;~/、file://、$HOME、末尾带/(如./pkg/)全都不行 - 该路径下必须存在合法的
composer.json文件,且至少含name和version字段,name格式必须为vendor/name(全小写、无空格、无大写字母)
Windows 用户建议统一用正斜杠:"url": "C:/dev/my-pkg" 或 "./packages/my-pkg";路径含中文或空格时,命令可能被截断,务必用 realpath 转成干净的绝对路径再配置。
启用 symlink 模式才能实时同步本地修改
默认情况下,Composer 对 path 仓库执行的是复制(copy),不是符号链接。你改了本地包代码,项目里还是旧的——这不是 bug,是默认行为。
要让它像软链一样实时生效,必须在添加仓库时就带上 options 字段:
"repositories": [
{
"type": "path",
"url": "./packages/my-utils",
"options": {
"symlink": true
}
}
]
注意:options 只对 type: "path" 有效,且不能后续用 composer config 补加;Linux/macOS 默认支持 symlink,Windows 则需提前启用“开发者模式”或以管理员权限运行终端,否则 fallback 成 copy。
require 版本号必须和本地包composer.json里的version匹配
执行 composer require myorg/utils:dev-main 时,Composer 会去你 url 指向的目录读取 composer.json,然后比对里面的 version 字段。如果本地包写的是 "version": "dev-main",那你就得明确 require dev-main;写 "1.0.x-dev" 就得 require 1.0.x-dev。
常见踩坑点:
- 本地包
composer.json没写version,Composer 直接跳过该仓库,不报错也不提示 - require 时用了
*或dev-master,而本地包实际是dev-main,版本不匹配导致安装失败 - 本地包 name 写成
MyOrg/Utils,但 require 写myorg/utils,大小写不一致也会被忽略
真正起作用的永远是主项目执行 composer require 这一刻,Composer 解析你本地包的 composer.json,把它的 require 依赖一并拉进主项目的 vendor,而不是本地包自己跑 composer install。











