composer 支持用 path 类型仓库引用本地目录,需在主项目 composer.json 的 repositories 中声明 type 为 path、url 为本地路径,且 require 的版本号必须与本地包 composer.json 中的 version 字段完全一致;默认复制安装,启用 symlink 需配置 "options": {"symlink": true},仅 linux/macos 原生支持,windows 需管理员权限及开发者模式。

用 path 类型仓库直接引用本地目录
Composer 支持把本地文件夹当作一个“包仓库”,只要在 composer.json 里声明 path 类型的仓库,就能像装远程包一样安装本地代码。它不走网络,不依赖 Packagist,适合开发中试用未发布、还在改的私有库。
- 本地包的根目录必须包含合法的
composer.json(至少要有name和version) - 主项目
composer.json的repositories字段要加一条记录,type设为path,url填绝对路径或相对于主项目的相对路径 -
require里的版本号必须和本地包composer.json中的version完全一致(比如写"1.0.0"就不能只写"^1.0",否则会 fallback 到 Packagist 查找)
{
"repositories": [
{
"type": "path",
"url": "./my-local-package"
}
],
"require": {
"acme/my-local-package": "dev-main"
}
}
dev-main 这种版本名怎么来的?
path 类型仓库不解析 Git 分支或标签,它靠的是本地包 composer.json 里的 version 字段。但如果你没写 version,或者写的是 dev-main、dev-develop 这类非语义化版本,Composer 会允许你用同名字符串 require —— 它其实是在“绕过版本约束校验”。
- 如果本地包
composer.json没写version,Composer 默认当它是dev-main(Git 当前分支名) - 你也可以显式写
"version": "dev-feature/x",然后在主项目里require对应的字符串 - 不推荐省略
version:CI 环境可能没 Git 信息,dev-main会变成未知,导致安装失败
为什么 composer install 后没看到软链接?
默认情况下,path 包是复制而非链接:Composer 把整个本地包目录内容拷进 vendor/,而不是建 symlink。这是为了保证可重现性 —— 避免因本地源码变动意外影响已安装的依赖。
- 想改用符号链接?得在主项目
composer.json加"options": {"symlink": true}:{ "repositories": [ { "type": "path", "url": "./my-local-package", "options": {"symlink": true} } ] } -
symlink: true只在 Linux/macOS 有效;Windows 需管理员权限 + 开启开发者模式,否则静默失败 - 启用 symlink 后,
vendor/acme/my-local-package就是原目录的快捷方式,改源码立刻生效,但composer update可能报错(提示“package is not installed”),此时先rm -rf vendor/acme/my-local-package再重装
常见错误:Could not find a matching version
这个错八成是版本对不上。不是路径错了,是 require 的版本字符串和本地包 composer.json 的 version 不严格相等。
- 检查本地包
composer.json:运行cat ./my-local-package/composer.json | grep version - 检查主项目
require:确保字符串完全一致,包括大小写和连字符(dev-mybranch≠dev-my-branch) - 如果本地包用的是 Git 分支,别信
git branch输出 —— Composer 只认composer.json里的version,不是当前分支名 - 还不行?临时删掉
vendor/和composer.lock,再composer install,避免 lock 文件缓存旧解析结果
路径本身不难配,真正卡住人的永远是版本字符串那一个字符的偏差,还有 symlink 在 Windows 上的静默失效。










