必须用 path 仓库并设 "symlink": true 才能实时读本地包代码;composer link 仅适用于已安装包但易被 update 覆盖,且需手动 dump-autoload。

直接用 composer require 装本地包,根本不会生效——它只会去 Packagist 拉远程版本。真要让主项目实时读你改的代码,必须显式告诉 Composer:“这个包,就从我本机这个文件夹取”。路径仓库(path)是唯一可靠、可复现的方式。
为什么 composer install 不创建软链接?
默认情况下,path 类型仓库会把本地目录「复制」进 vendor/,不是链接。这是为了保证部署时的可重现性,但对开发毫无帮助。
要改成符号链接,得加一个开关:
- 在主项目的
composer.json的repositories块里,给path条目加上"options": {"symlink": true} - 确保目标目录(比如
../my-package)下有合法的composer.json,且其中name字段和你在主项目require中写的完全一致 - 运行
composer update vendor/name(必须带包名),不能只跑composer update
完成后,vendor/vendor/name 就是真实符号链接,ls -l 可验证。
composer link 什么时候能用?
这个命令只对「已经通过 composer require 安装过的包」有效,本质是在 vendor/ 下手动建软链,绕过版本约束。但它不碰 composer.lock,也不刷新自动加载映射。
典型操作流程:
- 先执行
composer require vendor/name把包装进去(哪怕只是dev-main) - 进入本地包目录:
cd ../my-package,运行composer link - 回到主项目根目录,再运行一次
composer link vendor/name
⚠️ 风险点:后续任何 composer update 都可能把它打回原形,变成复制模式;且如果本地包没跑过 composer dump-autoload,PSR-4 自动加载很可能失效。
路径写错会导致什么错误?
url 必须是相对于主项目根目录的相对路径,不能用 ~/ 或绝对路径。一旦写错,常见报错是:
-
Could not parse version constraint:目标目录下没有composer.json,或composer.json格式非法 -
Package vendor/name not found:主项目require中写的包名和本地包composer.json里的name不一致(注意大小写、斜杠方向) -
Failed to clone ... no such file or directory:路径存在但不可读,比如权限不足,或路径中含空格未转义
最稳妥的调试方式:在主项目根目录下,直接 ls -la ../my-package 看能不能通——不通,就别指望 Composer 能通。
软链接看着简单,但实际卡点全在路径解析和 autoload 同步上。很多人改完 composer.json 就跑 install,忘了 update 才真正触发仓库重解析,也忘了 dump-autoload 得手动补一刀。


















