Composer对path仓库默认禁用符号链接,优先保障构建可重现性;必须在主项目composer.json的repositories中显式配置"options": {"symlink": true},并执行composer update(非install)才能创建软链,否则fallback为复制模式。

为什么 vendor 里是普通文件夹,不是符号链接
Composer 对 path 类型仓库默认不创建 symlink,它优先保障构建可重现性,而非开发便利。即使你写了 "type": "path",只要没显式启用 symlink,它就会静默 fallback 到复制(copy)模式——你改本地代码,vendor/ 里完全不会变。
验证是否真用了 symlink:
• Linux/macOS:运行 ls -la vendor/acme/utils,输出中必须含 ->
• Windows:运行 dir vendor\acme\utils,看到 JUNCTION 或“快捷方式”字样才算成功
• 若只是普通目录,说明已 fallback,立刻检查配置是否生效
symlinks: true 放错位置导致完全忽略
这个字段只在特定位置有效:必须写在主项目 composer.json 的 repositories 数组中对应 path 条目内,不能塞进 config 段,也不能放在全局配置里。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- ❌ 错误写法(被完全忽略):
{"config": {"symlinks": true}} - ✅ 正确写法:
{"repositories": [{"type": "path", "url": "../my-pkg", "options": {"symlink": true}}]} - 注意版本兼容:
"symlink": true仅 Composer 2.2+ 支持;旧版需用"options": {"symlink": true},混用会失效
路径和 name 字段严丝合缝才能被识别
Composer 不做模糊匹配,任何细微偏差都会跳过你的本地包,转头去 Packagist 找远程版本,报 Could not find package 却不提示原因。
-
url必须是绝对路径(如/home/user/my-pkg)或项目根目录起算的相对路径(如../my-pkg),禁用~或$HOME -
url指向的目录必须真实存在、非空、不含嵌套软链,且根目录下有合法composer.json - 本地包的
composer.json中"name"字段必须与主项目require中声明的**逐字一致**:大小写、斜杠、vendor 名都不能差,例如"acme/utils"≠"Acme/utils"或"acme/utils "(末尾空格)
composer install 不重建 symlink?必须用 update
composer install 完全依赖 composer.lock,它只还原已有记录,不会重新解析仓库类型或触发 symlink 创建逻辑。哪怕你改了配置、清了 vendor,只要 lock 里记的是 copy 模式,它就继续 copy。
- 首次引入:执行
composer require acme/utils:dev-main或composer update acme/utils - 后续修改本地包代码后:无需再操作——symlink 已存在,改源码即刻生效
- 但若要刷新 symlink(比如改了
url路径或重配options):必须删掉vendor和composer.lock,再运行composer update acme/utils --no-cache --prefer-source - 验证关键点:打开
composer.lock,搜索该包,确认"source": {"type": "path"},而不是"type": "git"
composer.lock——它不是“重试”,而是强制让 Composer 重新走一遍依赖发现流程。只要 lock 文件里还存着旧的 source 记录,所有配置都形同虚设。

















