Composer path仓库url必须以./或../开头且指向含composer.json的目录,否则静默跳过;name须逐字匹配require声明,repositories须置于composer.json根级,type必须小写"path"。

必须用 ./ 或 ../ 开头,且 url 指向的是含 composer.json 的目录,不是文件本身;写错一个斜杠、多一个 / 尾缀、漏掉点号,Composer 就静默跳过,不报错也不提示。
path 仓库的 url 必须以 ./ 或 ../ 开头
Composer 只认相对路径,且强制要求以 ./ 或 ../ 起始。它不解析 ~、$HOME、绝对路径(如 /home/user/pkg),也不接受 file:// 协议。
-
"url": "my-package"❌ 缺少./前缀,被忽略 -
"url": "/abs/path"❌ 绝对路径,静默失效 -
"url": "../my-pkg/"❌ 末尾带/,整个仓库条目被跳过 -
"url": "../my-pkg"✅ 正确:上层目录下的my-pkg文件夹,且该文件夹内有composer.json
本地包的 composer.json 必须合法且 name 完全匹配
Composer 不看目录是否存在,只校验 name 字段是否与 require 中写的字符串逐字一致——大小写、短横线 -、斜杠 / 全部敏感。
- 本地包
composer.json中写"name": "acme/utils",则require必须是"acme/utils": "dev-main",不能是"Acme/Utils"或"acme_utils" -
version字段可选,但若写了,require中的版本别名(如dev-main)必须对应 Git 分支名,不能是1.0.0 - 本地包目录下必须有 Git 仓库(至少
git init && git add . && git commit -m "init"),否则dev-main无法解析
repositories 必须写在主项目 composer.json 根级
这个字段不能塞进 require、autoload、config 或任何嵌套结构里,必须和 require 并列,位于 composer.json 最外层。
{
"repositories": [
{
"type": "path",
"url": "../my-utils"
}
],
"require": {
"acme/utils": "dev-main"
}
}
- 漏掉
repositories,或位置不对,composer require acme/utils:dev-main就会去 Packagist 盲搜,报Could not find package -
type必须小写"path",写成"Path"或"PATH"都会静默失败 - 改完
composer.json后,必须运行composer update acme/utils,install不刷新已存在包
符号链接(symlink)是否生效,取决于本地包自己的 options 配置
想让 vendor/acme/utils 实时同步你改的源码,不是复制副本,关键不在主项目,而在本地包自己的 composer.json 里加 "options": {"symlink": true}。
- Windows 用户必须以管理员身份运行终端,否则
symlink创建失败且无提示 - Docker 环境需加
--cap-add=SYS_ADMIN,且挂载方式要支持 symlink - 验证是否真链接成功:
ls -la vendor/acme/utils(Linux/macOS)看到->,或dir vendor\acme\utils(Windows)看到JUNCTION - 如果显示为普通文件夹,说明 fallback 到了 copy 模式——立刻检查本地包根目录下的
composer.json是否漏了options段
最常被忽略的一点:路径是相对于主项目 composer.json 的位置计算的,不是当前 shell 工作目录;哪怕你在子目录里执行 composer update,../my-pkg 依然向上找主项目的同级目录。











