composer默认不创建软链接,必须在主项目composer.json的repositories中配置"type":"path"和"options":{"symlink":true},路径、包名、版本约束(如"@dev")三者须严格匹配,否则静默回退为复制。

Composer 默认不创建软链接,必须显式启用 path 仓库 + "symlink": true 配置,否则你改完本地包代码,vendor 里永远是静态副本。
怎么配 repositories 才让 path 生效
配置必须写在主项目根目录的 composer.json 最外层 repositories 数组里,不能嵌套、不能放错位置:
-
url必须是相对于该composer.json的路径,推荐用"../my-package"这种显式写法;~、$HOME、file://全部无效 - 目标目录下必须有合法
composer.json,且其中name字段(如"acme/utils")要和require里写的**完全一致**(大小写、斜杠、无空格) - 如果本地包是 Git 仓库,必须已执行过
git init && git add . && git commit,否则 Composer 会静默跳过 - 多个仓库时,把
path条目放在数组最前面,避免 Packagist 优先命中同名包
require 版本写错就白配了
写稳定版约束(如 "^1.0"、"1.0.0")或分支别名不匹配(如本地只有 main 却写 "dev-master"),Composer 会直接忽略 path 源,转去 Packagist 拉包。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 最稳写法:
"acme/utils": "@dev"—— 强制走path解析,不校验分支是否存在 - 若本地包
composer.json明确写了"version": "1.0.x-dev",则require必须写"1.0.x-dev",不能简写为"1.0.x" - 写
"dev-main"前先确认git branch输出里真有main;没 Git 的话,@dev更可靠 - 本地包
composer.json中不能有"type": "project",否则 Composer 直接跳过加载
为什么 vendor 里不是软链接
不是 bug,是权限或配置导致的静默 fallback:Linux/macOS 下 ls -la vendor/acme/utils 没 -> 箭头,Windows 下 dir vendor\acme\utils 不显示 <symlinkd></symlinkd>,说明 symlink 失败,实际是复制。
- 检查
config.symlinks是否被设为false(运行composer config --list | grep symlinks) - Windows 用户必须开启「开发者模式」或以管理员身份运行终端;Git Bash/WSL 要统一用
/分隔符 - Docker 容器内挂载宿主机目录时,需加
follow_symlinks=1选项,否则容器无法解析符号链接 - 终极验证命令:
readlink vendor/acme/utils,输出应为你的开发路径;为空 = 没链接成功
IDE 断点进不去本地包?不是 Composer 的问题
PHPStorm 和 VS Code 默认索引的是 vendor/ 下的物理路径,而 path 模式创建的是符号链接,IDE 缓存或设置没跟上就会跳转失败。
- PHPStorm:打开
Settings > Directories,把vendor/acme/utils标为Excluded,再把../my-package标为Sources - VS Code:确保
intelephense.environment.includePaths包含本地包路径,并确认intelephense.environment.followSymbolicLinks开启(新版默认开启,但某些场景反而需关闭) - 改完代码后,手动触发「Reload project from composer.json」或重启 Intelephense 服务
真正难的不是配对参数,而是系统级 symlink 支持是否到位——Windows 权限、Docker 挂载选项、IDE 路径缓存,三者任一失效,都会让你以为配置错了,其实只是链没建起来。










