path仓库是唯一靠谱方案,因其明示Composer从相对路径(如"../my-package")加载含合法composer.json的本地包,默认启用符号链接实现代码实时同步,且要求主项目require、本地包name及version三者严格一致。

直接用 path 类型仓库配软链接,别碰 composer link——它只对已安装包临时生效、不写 lock、易被后续 update 覆盖,调试中掉坑概率极高。
为什么 path 仓库是唯一靠谱方案
Composer 默认把本地目录当“黑盒”,除非你明说“这儿有个包”。path 类型仓库就是干这个的:告诉 Composer “去这个相对路径里找源码”,并默认启用符号链接(Linux/macOS)或目录映射(Windows),改代码立刻反映到 vendor/ 下。
-
url必须是相对于主项目composer.json的路径,比如"../my-package"或"./packages/utils";绝对路径、~/、跨出项目根的../../全部被拒绝 - 目标目录下必须有合法
composer.json,至少含"name"和"version"(如"version": "dev-main") - 不加
"minimum-stability": "dev",dev-main这类分支别名会被直接过滤掉 - Windows 用户需开启“开发者模式”或以管理员身份运行终端,否则
symlink创建失败,报错failed to create symbolic link
composer.json 三处关键配置必须对齐
错一个字符,composer update vendor/name 就报 Could not find package。重点核对:
- 主项目
composer.json中repositories.url:比如"../my-package" - 主项目
require里的包名:"my-vendor/my-package": "dev-main"(大小写、连字符、斜杠全要一致) - 本地包根目录
composer.json的"name"字段:"name": "my-vendor/my-package"
别用 * 或 @dev 替代分支名——path 类型不走语义化版本解析,只认明确分支别名。
执行后怎么确认软链接真生效了
别只看 vendor/ 目录是否存在,得验证底层链路:
- Linux/macOS:运行
readlink vendor/my-vendor/my-package,输出应为你的本地路径(如../my-package) - Windows:运行
dir vendormy-vendormy-package,若显示或指向真实目录,则成功 - 跑一句 PHP 检查 autoload:
php -r "echo class_exists('MyPackage\Calculator') ? 'ok' : 'fail';",输出ok才说明自动加载通了 - 改一行本地包里的代码,立刻在主项目里调用,结果应同步变化;如果没变,大概率是忘了运行
composer update my-vendor/my-package
最常被忽略的一点:删过 vendor/ 或重装依赖后,软链接不会自动重建——必须手动再跑一次 composer update vendor/name。CI 环境默认禁用 symlink,得显式加 --prefer-source 或检查 COMPOSER_SYMLINKS=1 环境变量。











