composer install默认不创建符号链接,因其设计目标是精确还原composer.lock状态,不重走依赖解析逻辑;仅当执行composer update或composer install --prefer-source且配置、路径、权限均满足时才可能创建。

composer install 为什么默认不创建符号链接
因为 composer install 的设计目标是「精确还原 composer.lock 记录的状态」,它不关心你本地有没有改代码、也不重走依赖解析逻辑。哪怕你配置了 "type": "path",只要 composer.lock 里该包的 source.type 是 "dist" 或没声明 "symlink": true,它就只会复制文件——这是可重现构建的底线。
常见错误现象:vendor/vendor/name 是普通文件夹,改了本地代码完全没反应。这不是 Composer 没识别到 path,而是它压根没尝试建链接。
-
composer install从不主动创建 symlink;只有composer update(或带--prefer-source的 install)才可能触发 - 是否启用 symlink,最终取决于
composer.lock中该包的source.type字段是否为"path",以及source.reference是否指向本地路径 - Windows 下即使配了
"symlink": true,若终端未以管理员身份运行,也会静默 fallback 到 copy
symlink 生效的三个硬性条件缺一不可
软链接不是配了 "options": {"symlink": true} 就自动成功。它需要主项目、本地包、系统三端同时满足:
- 主项目
composer.json的repositories中必须声明"type": "path",且url指向一个含合法composer.json的目录(不能是文件,也不能以/结尾) - 本地包自身的
composer.json必须包含"options": {"symlink": true}(注意:不是主项目的配置,是本地包自己的!2026 年起 Composer 2.2+ 才支持此字段) - 操作系统需支持 symlink:Linux/macOS 默认 OK;Windows 需开启开发者模式或以管理员权限运行命令;Docker 容器需加
--cap-add=SYS_ADMIN且挂载方式支持符号链接
验证是否真成功:运行 ls -la vendor/vendor/name(Linux/macOS)或 dir vendor\vendor\name(Windows),输出中必须出现 -> 或 JUNCTION 标识。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
改了本地包代码,为什么 composer install 不刷新链接
composer install 只检查 vendor/ 下是否存在对应目录,存在就跳过;它不会比对本地路径是否变更、也不会重建已有链接的目标。换句话说:链接一旦建好,它就“固化”在 vendor/ 里了。
- 要让修改生效,必须运行
composer update vendor/name—— 这会重新解析 path、校验本地composer.json、重建 symlink - 用
composer update不带参数是危险的:可能升级其他包,破坏当前状态;指定包名才是安全做法 - 如果本地包
composer.json的version没变(比如一直写"dev-main"),composer update可能因缓存跳过操作;可加--no-cache强制重拉
CI/CD 和 Docker 环境下 symlink 必然失败的根源
path 仓库本质是开发期便利机制,不是部署方案。CI 流水线或生产容器里,../my-local-package 这种相对路径大概率不存在,或者权限不足,导致 symlink 创建失败后 fallback 到 copy —— 但你根本看不到这个 fallback 日志。
- 上线前必须移除主项目
composer.json中的repositories下所有"type": "path"条目,否则composer install会报错找不到路径 - Docker 构建时,不要把本地开发目录挂进容器再指望 symlink 生效;应改用
"type": "package"+"dist"手动打包,或用私有 Packagist 替代 - 团队协作中,建议用环境变量控制 repositories,例如
"url": "${LOCAL_PKG_PATH}",再通过 CI 注入真实值,避免硬编码路径泄露到 Git
最易被忽略的一点:autoload 映射和 symlink 是两件事。即使链接建成功了,如果本地包的 composer.json 没配 autoload,或者主项目没执行 composer dump-autoload -o,类依然加载不到——这跟链接本身无关,但排查时常常混为一谈。










