答案是必须用composer update vendor/name触发仓库重发现并创建符号链接,因为install仅按lock文件复制;需在主项目repositories或本地包composer.json中配置"options":{"symlink":true},且验证系统级链接关系。

直接用 path 仓库 + symlink 选项,再配一次 composer update,就能让 vendor/ 下的包变成指向本地目录的符号链接——改本地代码,项目里立刻生效。其他方式(比如 composer link 或手动软链)要么不兼容新版本,要么容易被后续命令覆盖。
为什么 composer install 不创建软链接?
composer install 完全照搬 composer.lock,它根本不重新解析仓库类型,也不检查 symlink 配置。哪怕你改了 repositories,install 也只会复制旧快照。
- 必须用
composer update vendor/name(精确指定包名),才能触发仓库重发现和 symlink 创建流程 - 首次引入时,
require字段写"dev-main"或"*@dev",否则 Composer 可能跳过 path 仓库去 Packagist 找稳定版 - 执行后检查
composer.lock里该包的"source": {"type": "path"}是否存在,不是"git"或"package"
path 仓库启用 symlink 的两种写法
只在其中一个地方加 "options": {"symlink": true} 就行,但位置不能错:
- 写在主项目
composer.json的repositories条目里(推荐):"repositories": [ { "type": "path", "url": "../my-local-package", "options": {"symlink": true} } ] - 或写在本地包自己的
composer.json根级(注意:不是主项目):{ "name": "vendor/my-local-package", "options": {"symlink": true}, "autoload": { ... } } - Windows 用户必须以管理员身份运行终端,否则
symlink会静默 fallback 到 copy 模式 - Composer 版本必须 ≥ 2.2;旧版本完全忽略该配置,且不报错
验证软链接是否真生效?
别只看文件夹名字,得确认系统级链接关系:
- macOS/Linux:运行
ls -la vendor/vendor/name,输出中必须含->和目标路径 - Windows:用
dir vendor\vendor\name,看到<symlinkd></symlinkd>或类似标识才算成功 - 改本地包里的一个类方法,然后在主项目里调用它——如果返回的是你刚改的逻辑,说明链接通了
- 如果改了本地包的
autoload(比如新增 PSR-4 命名空间),必须手动跑composer dump-autoload,否则自动加载器找不到新类
最容易被忽略的一点:路径、包名、分支名三者必须严丝合缝。哪怕 composer.json 里 "name" 多了个空格,或者 url 是绝对路径,Composer 都会直接放弃 path 仓库,转头去 Packagist 报错 “Could not find package”。


















