Composer 用 path 仓库类型可让本地包被直接识别:在项目 composer.json 的 repositories 中添加 type: "path" 和相对路径 url,require 对应 name;需确保本地包有正确 name 和 version,启用 symlink 需设 preferred-install 为 "source" 并初始化 Git。

用 path 仓库类型让 Composer 找到本地包
Composer 默认只从 packagist.org 或私有仓库拉包,本地改着改着就要 composer update 推远程再拉,效率极低。直接告诉 Composer:“这个包就在我电脑上某个文件夹里”,靠的是 path 类型仓库。
在项目根目录的 composer.json 里加一段:
{
"repositories": [
{
"type": "path",
"url": "../my-local-package"
}
],
"require": {
"vendor/my-local-package": "*"
}
}
注意三点:
-
url是相对于当前composer.json的路径,不能用绝对路径(Windows 下也不要用C:\...) - 本地包自己的
composer.json必须有正确的name(比如"vendor/my-local-package"),否则匹配不上 -
"*"版本会自动映射到本地包的version字段或dev-main这类分支名,别写死成"1.0.0",否则可能不生效
为什么 composer install 后没看到软链接?
默认情况下,path 仓库安装的是**硬拷贝**——Composer 把整个本地包文件夹复制进 vendor/,不是 symlink。改本地源码不会实时反映到项目里,这是最常被吐槽的点。
要启用符号链接,必须加一个配置开关:
composer config --local repositories.packagist.org.allow_ssl_downloads true
composer config --local preferred-install '{"*": "source"}'
composer config --local autoloader-suffix MyProject
关键在第二行:"source" 模式才会尝试 symlinking(前提是系统支持且本地包是 Git 仓库)。但更稳的办法是在本地包根目录运行:
git init git add . git commit -m "init"
否则 Composer 会退回到拷贝行为。Windows 用户还要确认开启了开发者模式或以管理员身份运行终端,不然 symlink 权限不够。
path 包依赖其他本地包时怎么连起来?
比如 my-local-package 依赖另一个正在开发的 my-utils,两者都在你电脑上不同文件夹。不能只在主项目里配一个 path,得让 my-local-package/composer.json 自己也声明仓库:
{
"repositories": [
{
"type": "path",
"url": "../my-utils"
}
],
"require": {
"vendor/my-utils": "*"
}
}
但要注意:Composer 不会递归解析嵌套的 repositories。所以你必须在**主项目**的 composer.json 里,把所有用到的本地路径都列全:
- 主项目
composer.json的repositories要包含../my-local-package和../my-utils - 两个本地包各自的
composer.json仍可保留repositories,只是它对依赖解析不起作用,仅作文档或未来迁移到私有仓库时参考 - 如果漏掉某一个路径,
composer install会报错Could not find package vendor/my-utils,哪怕它明明在隔壁文件夹
切换回远程包时容易卡在哪?
开发完想切回 packagist 正式版,很多人删掉 repositories 就跑 composer update,结果 vendor 里还是旧代码——因为 Composer 缓存了已安装的包信息,而且硬拷贝的文件不会自动清理。
安全切换步骤:
- 先删掉
composer.json里的repositories块和对应require的本地包行 - 运行
composer remove vendor/my-local-package(别手删 vendor 文件夹) - 再
composer require vendor/my-local-package:^2.0拉正式版 - 如果之前用了
"source"模式,检查vendor/vendor/my-local-package是否仍是 symlink,是的话手动删掉再重装
最麻烦的是 autoload 冲突:本地包改过命名空间或 PSR-4 映射,切回远程版后 composer dump-autoload 可能报找不到类。这时候得核对两边 composer.json 的 autoload 配置是否一致。
路径关联看着简单,真正串起三四个本地包时,每个 composer.json 的 name、version、autoload 和顶层 repositories 列表,差一个字母就白折腾半天。










