Composer本地包必须在主项目composer.json的repositories中声明type为path的仓库,url为相对路径,require中版本写"*",且本地包composer.json的name须与require完全一致。

composer.json 里用 path 类型仓库声明本地包
直接改 composer.json 的 repositories,加一个本地路径仓库,类型必须是 path,不是 vcs 或 package。否则 Composer 不会识别为可软链接源。
示例配置:
{
"repositories": [
{
"type": "path",
"url": "../my-local-package"
}
],
"require": {
"vendor/my-local-package": "*"
}
}
注意:url 是相对于当前项目根目录的路径,不能是绝对路径;require 中的版本号写 * 才能触发 path 仓库的 symlink 行为,写具体版本(如 dev-main)可能 fallback 到 dist 模式。
composer install 后没生成软链接?检查这些点
Composer 默认只在 dev 环境且满足条件时才创建 symlink。常见失败原因:
-
COMPOSER_HOME或项目级config.json里设置了"preferred-install": "dist"—— 这会强制下载 zip 包,跳过 symlink - 本地包根目录下没有
composer.json,或其中name字段和require里的不完全一致(包括大小写) - 运行
composer install前已存在vendor/vendor/my-local-package,Composer 不会自动替换为 symlink,得先rm -rf vendor/vendor/my-local-package - Windows 上需启用开发者模式或以管理员身份运行终端,否则 symlink 创建失败且无明确报错
修改本地包代码后要立刻生效,但 composer dump-autoload 不够
软链接本身是文件系统级的,改源码不需要重装包。但 PHP 自动加载器缓存可能让改动不生效:
- 如果用了
composer install --optimize-autoloader(或生产环境),得手动运行composer dump-autoload - Laravel 项目还要清
bootstrap/cache/autoload.php和bootstrap/cache/config.php(如果缓存了配置) - 某些 IDE(如 PHPStorm)会缓存类结构,需要右键 vendor 目录 → “Reload project”
更稳妥的做法:开发阶段始终用 composer install --no-optimize-autoloader,避免 autoload 优化干扰调试节奏。
为什么不用 composer link?它早被废弃了
老教程里提的 composer link 命令在 Composer 2.0+ 已彻底移除,现在没有任何官方命令能替代 path 仓库机制。
强行找第三方插件(如 hirak/prestissimo 或自定义脚本)不仅增加维护成本,还容易和 Composer 的依赖解析逻辑冲突——比如当本地包又依赖另一个 path 包时,嵌套 symlink 可能导致 autoload 错乱。
真正要“实时调试”,核心就两点:用对 path 仓库 + 确保 autoload 不卡壳。其它花活都是绕路。


















