<p>composer install 不创建软链接是设计使然,因其仅按 composer.lock 还原状态、跳过 repositories 解析;必须用 composer update 触发依赖解析流程,并满足 url/name/options.symlink 三者严格匹配及版本写 * 或 dev-main 才能生效。</p>

composer install 无法创建本地软链接,这是设计使然,不是 bug —— 它压根不解析 repositories 配置,只按 composer.lock 复制包。
为什么 composer install 不触发 path 仓库的 symlink
因为 composer install 的唯一任务是还原 lock 文件记录的状态:它跳过所有 repositories 解析、忽略 path 源、不校验本地包是否存在,只从 composer.lock 里读取 dist URL 和 version,然后复制或解压。
常见错误现象:
- 刚在
composer.json里加了path仓库,composer install却仍从 Packagist 下载包 - 本地包改了代码,
composer install后 vendor 里还是旧文件,没更新 - 命令行输出 “Symlinking xxx” —— 别信,那是日志残留,实际没建链
真正生效的只有 composer update(全量或指定包),它会重新走依赖解析流程,识别 path 源并检查 options.symlink。
path 仓库软链接生效的三个硬性条件
缺一不可,否则 Composer 默默 fallback 到拷贝模式,且不报错。
-
url必须是相对路径(如"../my-package")或绝对路径(如"/Users/me/my-package"),不能带file://或~ -
name字段必须和主项目require中的字符串逐字节一致(大小写、斜杠方向都不能差) -
options.symlink必须显式写在repositories条目里,放在本地包自己的composer.json或全局 config 中都无效
版本号必须用 "*" 或 "dev-main" —— 写 "^1.0" 或 "~2.0" 会让 Composer 直接忽略该 path 源,转去 Packagist 查。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
验证 symlink 是否真生效,别看日志看文件系统
运行 composer update vendor/name 后,直接检查 vendor/vendor/name 目录是否为符号链接:
ls -la vendor/acme/utils
如果输出类似 acme/utils -> /Users/me/my-package,说明成功;如果显示普通目录结构,说明某处配置不匹配,得回头逐条核对上面三个条件。
注意:vendor/bin 下的二进制软链是另一套机制(由 BinLinker 类硬编码处理),和 path 仓库无关,也不受 options.symlink 控制。
本地开发 workflow 的正确姿势
不要把 composer install 当作“同步本地修改”的命令。日常开发中:
- 首次接入本地包:改完
composer.json的repositories和require,跑composer update vendor/name - 后续改本地包代码:无需任何 Composer 命令,改完即生效(前提是 symlink 已建好)
- 想强制重连:删掉
vendor/vendor/name目录,再跑composer update vendor/name,不要用install
最容易被忽略的是:本地包根目录下必须有合法 composer.json,且 Git 至少有一个 commit —— 没 commit 的空仓库,Composer 会拒绝加载,报 Could not find package,而不是提示 Git 问题。

















