必须用 path 类型仓库而非 composer link——因后者要求包已安装且存在 vendor 目录,未提交的本地包无法满足前提,会报错“Package not found”;而 path 仓库通过 repositories 配置直接将本地目录视为源,配合 "@dev" 版本和正确 autoload 即可实现实时开发。

必须用 path 类型仓库,而不是 composer link —— 后者只对已发布包生效,且不改 composer.lock,无法用于“尚未提交”的本地开发态包。
为什么 composer link 对未提交包完全无效
composer link 的前提是:该包已通过 Composer 正常安装过(即 vendor/ 下已有真实目录),然后你在包源码根目录执行该命令,它才在 vendor/ 里建软链。但“尚未提交的私有包”通常连 Git 仓库都没初始化,更不可能被 composer require 成功安装——composer link 根本没机会运行。
- 执行
composer link前若vendor/my-vendor/my-package不存在,会直接报错Package not found in vendor - 即使你手动创建空目录,Composer 也不会识别它为“已安装包”,插件逻辑直接跳过
- 该命令不读取本地
composer.json的autoload配置,类加载大概率失败
正确做法:用 repositories.type = "path" 强制指向本地目录
这是唯一能绕过版本约束、跳过 Git 提交、让未 commit 的代码实时生效的方式。关键不是“链接”,而是让 Composer 把你的本地目录当作一个合法仓库来解析。
- 确保本地包根目录下有完整
composer.json,其中name字段(如"my-vendor/my-package")必须与主项目require中的名称**完全一致**(包括大小写、连字符) - 在主项目
composer.json的repositories数组**首位**添加:"repositories": [ { "type": "path", "url": "../my-local-package" } ]注意:url是相对于主项目composer.json的路径,不能用~/或绝对路径 - 把依赖写成
"my-vendor/my-package": "@dev"(不是dev-main,也不是*),@dev才会匹配 path 仓库下的任意分支/未提交状态 - 运行
composer update my-vendor/my-package—— 必须带包名,否则可能误更新其他依赖
验证是否真走软链、代码修改是否实时生效
别信 composer install 输出“成功”,得亲手确认底层路径和运行时行为。
- 执行
ls -la vendor/my-vendor/my-package(Linux/macOS)或dir vendormy-vendormy-package(Windows),输出中含->符号才算软链成功 - 修改本地包里的某个类方法,然后在主项目中运行
php -r "echo (new MyPackageCalculator())->add(1,2);",结果应立即反映你的修改 - 如果报
Class not found,90% 是本地包composer.json中autoload.psr-4写错(比如漏了末尾反斜杠"MyPackage\": "src/")或没运行composer dump-autoload - Docker/WSL 环境下,
ls -la显示但readlink -f失败,说明宿主机路径未正确挂载,软链目标不可达
最易忽略的一点:Windows 用户必须启用“开发者模式”,否则 Composer 创建软链失败却**不报错**,静默 fallback 到复制模式——你改了本地代码,主项目里永远看不到效果。











