Composer对path仓库默认禁用软链,仅当在主项目repositories条目或本地包composer.json中显式配置"options": {"symlink": true"}且执行composer update vendor/name后,才会创建符号链接;否则fallback为硬复制。

为什么 vendor 里是普通文件夹,不是符号链接
Composer 对 path 类型仓库默认禁用软链,只在显式声明 "options": {"symlink": true} 后才尝试创建。它优先保障构建可重现性,而非开发便利性——这不是 bug,是设计使然。
symlink 配置写在哪才生效
必须选其一,不能同时写或漏写:
- 在主项目
composer.json的repositories条目里加:"options": {"symlink": true} - 或在本地包自己的
composer.json根级加:"options": {"symlink": true}(注意:不是写在主项目里)
Windows 用户必须以管理员身份运行终端,或已开启“开发者模式”,否则 symlink 会静默失败并 fallback 到 copy 模式。
composer install 不创建 symlink?必须用 update
composer install 完全依赖 composer.lock,它不会重新解析仓库类型或触发 symlink 创建逻辑。只有 composer update vendor/name 才会重走发现-解析-链接全流程。
- 首次引入:执行
composer update vendor/name(推荐精确更新,避免波及其他包) - 后续修改本地包代码后:无需再
update——symlink 已存在,改源码即刻反映到项目中 - 验证是否成功:运行
ls -la vendor/vendor/name(macOS/Linux)或dir vendor\vendor\name(Windows),输出中必须含->才算成功
Composer 版本和权限检查不可跳过
symlink 支持从 Composer 2.2 开始正式引入,旧版本会忽略该配置且不报错;同时需确认系统允许创建符号链接:
- 运行
composer --version,确保 ≥ 2.2 - 目标路径不能是绝对路径或
~/,必须是相对于主项目根目录的相对路径(如../my-package) - 本地包目录下必须有合法的
composer.json,否则报Could not parse version constraint - 如果改了本地包的 autoload 映射(比如新增 PSR-4 命名空间),必须手动运行
composer dump-autoload,否则自动加载器找不到新类
最容易被忽略的是:配置写了、命令也跑了,但没验证 ls -la 输出里有没有 ->;很多人卡在这一步,却回头去调镜像或重装 Composer。











