composer默认不创建symlink,仅在显式配置"options":{"symlink":true}、系统权限允许且执行composer update时才尝试创建;install完全跳过该流程,严格按lock文件还原。

Composer 不会“自动”创建 symlink,它只在明确满足条件时尝试创建——不配 symlink 选项、没开系统权限、或用 install 命令,就根本不会走 symlink 流程。
symlink 创建只发生在 update 阶段,install 完全跳过
这是最常被误解的一点:composer install 严格按 composer.lock 还原依赖,连仓库类型都不重新判断,更不会重建 symlink。composer update 才会重新解析 repositories、校验路径、检查权限、最终决定是否调用系统 mklink(Windows)或 symlink()(Unix-like)。
- 首次引入本地包?必须运行
composer update vendor/name,不是install - 已存在但链接失效?删掉
vendor/vendor/name后再update,install无用 -
composer require底层调用的是update,所以它能触发 symlink —— 但前提是配置和权限都到位
Windows 下 symlink 失败,99% 是权限问题,不是 Composer 配置错
Composer 在 Windows 上创建 symlink 的底层就是调用系统 mklink。普通用户默认无权执行,失败时 Composer 不报错,而是静默 fallback 到复制模式——你看到 vendor 里是完整副本,就说明 symlink 已被跳过。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 验证权限:以当前用户身份打开 PowerShell,运行
mklink /D test-link .,若提示“没有足够权限”,就是它 - 修复方式:开启「设置 → 系统 → 开发者选项 → 开发者模式」,重启终端(不用管理员身份)
- 别用管理员 CMD 运行 Composer:生成的链接归 Administrator 所有,后续
composer update会因权限拒绝失败 - 已污染?运行
icacls vendor /reset /T重置所有权
path 仓库必须显式启用 symlink,否则默认复制
即使你写了 "type": "path",Composer 默认仍会复制文件。它把可重现性放在开发便利性之前,必须人工干预才能启用 symlink。
- 启用方式只两种:
"options": { "symlink": true }放在主项目composer.json的repositories条目里,或放在本地包自己的composer.json根级(注意不是主项目配置) -
"symlink": true必须是布尔值true,写成字符串"true"无效 - 路径必须合法:相对路径如
"../my-pkg",绝对路径如"C:/dev/my-pkg";含~或$HOME直接失效 - 目标目录必须存在,且其中
composer.json有合法"name"字段,且与require中的包名**完全一致**(大小写、vendor 名都不能差)
symlink normalization 是 Composer 的路径纠错机制,不是 bug
当你看到日志里出现 Symlinking C:/projects/my-local-package into C:/projects/app/vendor/vendor/name,说明 Composer 正在做符号链接规范化:统一路径格式、避免嵌套循环、适配跨平台路径差异,并确保 autoloader 能正确扫描到真实文件。
- 它会把
../../packages/foo这类相对路径转成规范的绝对路径再创建链接 - 如果目标路径在 Docker volume 或 NFS 挂载点上,且挂载时禁用了
follow_symlinks,normalization 会退化为复制,且不提示 - Linux/macOS 下出现
Warning: symlink(): Operation not permitted,大概率是文件系统挂载参数导致,不是 Composer 本身问题
真正难调试的从来不是配置写法,而是 symlink 失败时 Composer 不报错、不提示、不回退到明确错误状态——它只是默默复制,让你以为“功能正常”,直到改了本地代码却毫无反应,才意识到链路早就断了。










