Composer本地包热更新本质是path仓库配合符号链接实现,需同时满足:显式配置"symlink":true、路径为相对/绝对路径、name字段逐字节一致、本地包有git初始化和commit、权限允许创建symlink。

Composer 本身不提供热更新能力,所谓“本地包热更新”,本质是利用 path 类型仓库 + 符号链接(symlink)机制,让主项目代码修改后**无需 composer update 就能立即生效**。关键不在 Composer 多智能,而在配置是否满足 symlink 的硬性条件。
path 仓库必须显式配置且严格匹配 name/url/symlink
只在 repositories 里加一条 {"type":"path","url":"../my-package"} 不够。Composer 默认不会启用 symlink,必须显式声明 "options": {"symlink": true},且三个要素缺一不可:
-
url必须是相对路径(如"../my-package")或绝对路径(如"/Users/me/my-package"),不能带file://或~ - 本地包的
composer.json中name字段(如"acme/utils")必须与主项目require中的包名**逐字节一致**(大小写、斜杠方向都不能错) -
"options": {"symlink": true}必须写在主项目composer.json的repositories条目里,写在本地包自己的composer.json或全局 config 中无效
本地包目录必须可被 symlink —— Git 和权限是隐形门槛
即使配置全对,Composer 也会静默 fallback 到复制模式(copy),导致改代码不生效。常见原因:
- 本地包目录没执行过
git init,或没至少一个 commit —— Composer 拒绝 symlink,直接 copy - Windows 下未以管理员身份运行终端,或未开启“开发者模式”,导致 symlink 创建失败
- 主项目
composer.json中"config": {"symlinks": false}被显式关闭 - 本地包目录权限不足(尤其 macOS/Linux 上的 sticky bit 或 group 写权限缺失)
验证是否真用了 symlink:ls -la vendor/acme/utils(macOS/Linux)输出应含 ->;Windows 上用 dir vendor\acme\utils,看到 <SYMLINKD> 才算成功。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
版本约束必须用 dev-main 或 @dev,别信 *
"acme/utils": "*" 看似灵活,但实际会优先查 Packagist,可能绕过你的本地 path 仓库。正确做法:
- 本地包
composer.json中version设为"dev-main"(或"dev-develop"),主项目require对应写"acme/utils": "dev-main"—— 这样切分支后,composer update acme/utils才能触发 symlink 更新 - 如果不想管分支名,统一用
"acme/utils": "@dev",它强制走 path 源,不查 Packagist,也不依赖本地包的version字段 - 删掉本地包目录后,Composer 不报错,但
composer install会跳过该包 —— 这比“找不到包”更安静,适合临时关闭调试
更新必须用 composer update,install 完全无效
composer install 只读 composer.lock,完全忽略 repositories 配置。哪怕你刚加了 path 仓库,运行 install 后 vendor 里仍是旧包,甚至还是 ZIP 解压出来的。
- 每次修改本地包代码后,要让主项目立刻感知,只需运行
composer update acme/utils(指定包名) - 如果本地包切了分支(如从
main切到feat/auth),且version是"dev-main",则必须先改本地包的composer.json中version为"dev-feat-auth",再运行composer update - 想绕过
update命令?可以手动rm -rf vendor/acme/utils && composer update acme/utils,但没必要 —— 正常流程就是update
真正容易被忽略的是:symlink 生效的前提是整个链路都“干净”——本地包有 Git、有 commit、name 匹配、options 显式开启、路径可访问。少一个,就 fallback 到 copy,改完代码也白改。

















