必须将repositories字段写在项目根目录composer.json的根级数组中,类型为"type": "path",url用相对路径指向含composer.json的目录,单个仓库也要写成[{ "type": "path", "url": "./packages/foo" }]。

composer.json里repositories字段怎么写才生效
必须写在项目根目录的composer.json根级repositories数组里,不能塞进require、config或子对象中。类型固定为"type": "path",url必须是相对路径(如"../my-package"),绝对路径在 Windows 或 CI 环境下大概率静默失败。
常见错误现象:Could not find a matching version of package vendor/name——不是包没放对,而是repositories压根没被读到,或者url指向一个不存在的目录。
-
url值不能是file://前缀,也不能是composer.json文件本身,必须是一个含composer.json的目录 - 每个
path仓库必须单独成数组元素,哪怕只配一个也要写成[{ "type": "path", "url": "./packages/foo" }] - 如果
url用了通配符(如"./packages/*"),每个匹配子目录都得有独立、合法的composer.json
本地包的composer.json要满足哪些硬性条件
Composer 不校验代码,只认composer.json里的元数据。缺任何一项,require就会失败,且不报具体原因。
-
name字段必须存在,且与require中写的完全一致(大小写敏感、vendor 名不可省略) -
version字段必须存在,可写"dev-main"、"1.0.x-dev"等开发版标识;path源下version不用于约束安装,但缺失会导致解析中断 - 若需自动加载,
autoload段必须合法(如{"psr-4": {"Vendor\Package\": "src/"}}),否则类找不到不是路径问题,而是 autoload 没注册 - 整个
composer.json语法必须正确,JSON 格式错误时 Composer 会跳过该仓库,不提示也不报错
为什么vendor里没出现软链接,改了本地代码也不生效
默认行为是复制(copy),不是符号链接(symlink)。你看到的vendor/vendor/name是副本,不是引用。改本地源码,它不会动。
- 启用 symlink 必须显式配置:
"options": {"symlink": true},加在repositories条目里,不是config里 - Linux/macOS 一般默认支持;Windows 需开启“开发者模式”或以管理员权限运行命令行,否则
symlink创建失败且无提示 -
composer install不会刷新已有链接,只补缺失项;改完本地代码后,必须执行composer update vendor/name重建 symlink - 验证是否成功:Linux/macOS 运行
ls -la vendor/vendor/name,输出应含->;Windows 用dir vendorendor ame看是否显示“快捷方式”类型
CI/CD 或上线部署时要注意什么
path 类型仓库本质是开发期特供,离线但不可移植。CI 环境里url指向的路径几乎一定不存在,链接必然失败,复制也可能因路径差异出错。
- 上线前必须从
composer.json的repositories中移除所有path条目,否则composer install会卡住或报错 - 不要把
path配置保留在主分支;推荐用 Git 分支隔离(如dev-local),或通过环境变量+脚本动态注入(如用composer config repositories.local --unset && composer config repositories.offline '{"type":"artifact","url":"/artifacts/"}') - 若团队共用同一套
composer.json,切记path的url必须用相对路径,避免硬编码/home/xxx或C:Usersxxx
最常被忽略的一点:path 仓库不触发任何远程元数据请求,但它极度依赖路径稳定性与配置一致性。一次误配可能让composer update静默跳过整个包,而错误信息只会说“找不到”,不会告诉你是因为name拼错了、composer.json少了个逗号,还是url多了一层./。











