composer link 命令从 Composer 2.4.0 版本起内置支持,无需插件;此前版本需手动安装已停止维护的 composer-plugin-link,且存在 autoload 不同步、composer update 覆盖链接等风险。

composer link 命令从哪个版本开始可用
Composer 内置 composer link 命令是从 2.4.0 版本起正式支持 的,无需额外插件。低于该版本(如 2.3.x 或 2.2.x)执行会报错:Command "link" is not defined.
如果你用的是旧版 Composer,又想实现类似功能,必须手动安装第三方插件 composer-plugin-link(已停止维护),但存在 autoload 不同步、composer update 覆盖链接等风险。
- 2.4.0+:原生支持,执行
composer link即可,在 vendor/ 下创建符号链接 - 2.3.x 及更早:不识别该命令,强行运行会提示未定义
- PHP 兼容性无额外要求,只要 Composer 本身能运行(PHP ≥ 7.4)
软链接生效的前提条件
composer link 不是“任意目录都能链”,它只对「已通过 composer require 安装进 vendor 的包」起作用。换句话说:你得先让 Composer 认下这个包名和版本,再进本地包目录执行 link。
典型失败场景:
- 本地包从未被
require过,直接cd /path/to/my-package && composer link→ 报错Package not found in installed.json - 本地包名与
composer.json中声明的name字段不一致 → 链接成功但 autoload 失败,类找不到 - 包类型不是
library(比如是project或metapackage)→link命令忽略,静默退出
软链接后为什么类还是找不到?autoload 同步问题
软链接只是改了 vendor/ 下的目录指向,vendor/autoload.php 并不会自动重生成 PSR-4 映射——它仍按 composer.lock 和原始安装时的 autoload 配置加载。
所以常见现象是:文件路径变了,但 new MyPackageClient() 仍报 Class not found。
解决办法只有两个:
- 在本地包的
composer.json中确保autoload配置正确(例如"psr-4": {"MyPackage\": "src/"}),然后运行composer dump-autoload(在主项目根目录) - 如果本地包没配 autoload,或你只想临时测试,可手动加一行到主项目的
autoload-dev:"psr-4": {"MyPackage\": "../my-package/src/"},再跑一次dump-autoload
link 后执行 composer update 会发生什么
这是最容易踩的坑:composer update 或 composer install --no-dev 会无视软链接,直接按 composer.lock 重新下载并解压包到 vendor/,覆盖掉你的符号链接。
也就是说,link 是临时开发手段,不是持久化方案。它不修改 composer.lock,也不写入任何元数据。
- CI/CD 流水线里绝对不要依赖
link,它不会跨机器生效 - 团队协作时,需明确告知成员“这个包是 link 的”,否则别人
install后代码行为不一致 - 真正要长期共存多版本,得用
pathrepository +repositories配置,而不是软链接


















