在 composer.json 中使用 path 类型仓库可离线引入本地包,需在顶层 repositories 中声明 url 为相对路径、type 为 "path",本地包 composer.json 必须有唯一 name,require 时填该 name 和匹配的版本(如 "dev-main"),否则会回退远程源报错。

composer.json 里用 path 类型仓库引入本地包
直接在 composer.json 的 repositories 中声明一个 path 类型仓库,就能让 Composer 从相对路径加载离线包。这比手动拷贝或 symlink 更可控,也支持版本约束。
- 必须把本地包的根目录(含
composer.json)作为url值,且路径需相对于项目根目录,比如"url": "../my-utils" -
type必须写成"path",不能是"package"或漏掉 - 本地包的
composer.json中name字段必须存在且唯一,否则 Composer 会报Could not find package xxx - 如果本地包没打 git tag,建议在
require中用"dev-main"或"*@dev",否则可能提示“no matching package found”
require 时指定本地包名和版本,别写路径
你不是在 require 里填路径,而是填那个本地包 composer.json 里定义的 name,然后用版本号触发 path 仓库匹配。
- 例如本地包
composer.json写了"name": "acme/utils",那就在项目中require写"acme/utils": "dev-main" - 版本号必须和本地包的分支/标签一致;若本地只有
main分支,就别写"1.0.0",除非你真打了 tag - 执行
composer update acme/utils比全量update更安全,避免意外升级其他依赖
常见错误:Package acme/utils not found 或反复走 packagist
这是最常卡住的地方:Composer 根本没识别到你的 path 仓库,或者匹配失败,于是退回到远程源搜索,自然找不到。
- 检查
repositories是否放在composer.json顶层,而不是嵌套在config或extra里 - 运行
composer config --list | grep repositories确认配置已被读取;或加-vvv看 debug 日志里有没有 “Reading repository path …” - 路径含空格或中文?Windows 下反斜杠
\要换成正斜杠/,否则解析失败 - 本地包
composer.json缺autoload?不会导致安装失败,但后续composer dump-autoload可能报错,属于另一类问题
离线场景下,path 仓库不走网络,但要注意更新逻辑
path 类型仓库本身完全离线,Composer 不会发 HTTP 请求。但「更新行为」容易误解:它默认只软链接(symlink),不复制文件,所以改本地包代码会立刻反映到项目中。
- 想强制复制而非链接?加配置
"options": {"symlink": false}到该repository定义里 - CI 或部署时需要可重现的副本?推荐加
"symlink": false,否则不同机器上链接目标可能不一致 - 删掉本地包目录后运行
composer install会失败,因为path仓库无法 fallback —— 这就是离线依赖的真实代价
repositories 配置位置正确、本地包 name 和 require 里的名字严格一致。其余都是围绕这个主干的微调。










