composer update 才能触发软链接,因 install 仅还原 lock 文件且跳过 repositories 解析;path 仓库需 url、name、options.symlink 三者严格匹配,且版本须用 dev-main 或 *,本地包需有合法 composer.json 和 Git 提交。

直接用 composer update 触发软链接,不是 composer install,也不是手动建 symlink —— 后者根本没用,前者不生效。
为什么 composer install 不会创建软链接
composer install 只读 composer.lock,完全跳过 repositories 配置解析。哪怕你刚改完 composer.json 加了 path 仓库,只要 lock 文件里还存着 Packagist 的 dist URL,它就照旧复制包,不会碰你的本地目录。
-
composer install的目标是还原环境,不是“应用新配置” - 软链接只在依赖解析阶段(即
update)由 Composer 决定是否启用 - 首次启用 path + symlink,必须跑
composer update vendor/name或全量composer update
repositories 配置写错三处,软链接就自动退化成复制
路径、name、options.symlink 必须同时满足,缺一不可。Composer 不报错,只默默 fallback 到拷贝模式。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
url必须是相对路径(如"../my-package")或绝对路径(如"/Users/me/my-package"),不能带file://、不能用~/;Windows 下必须用正斜杠/或双反斜杠\ - 本地包根目录下必须有合法
composer.json,且其中name字段(如"acme/utils")和主项目require里的字符串**逐字节一致**(大小写、斜杠方向都不能差) -
repositories条目里必须显式写"options": {"symlink": true}—— 放在本地包自己的composer.json里无效,放在主项目config里也不管用
版本号写 * 或 dev-main 才匹配 path 源
path 仓库不提供版本元数据,Composer 只认 dev- 开头的分支名或通配写法。写 ^1.0、~2.0 这类语义化约束,Composer 直接忽略该源,转头去 Packagist 查。
- 最稳写法是
"acme/utils": "dev-main",前提是本地包 Git 有main分支(.git/refs/heads/main存在) -
"*"等价于"*@dev",但要求本地包至少有一个 commit,否则 Composer 拒绝加载(不报 Git 错误,只报Could not find package) - 如果本地包没初始化 Git,Composer 会 fallback 到默认分支名
dev-main,此时写"dev-main"仍有效;写"dev-master"就失败
验证软链接是否真正生效
别信命令行输出的 Symlinking 提示,它可能只是日志误导。真正在乎的是 vendor 里那个目录是不是符号链接。
- Linux/macOS:运行
ls -la vendor/acme/utils,输出末尾应含-> /absolute/path/to/my-package - Windows:用
dir vendorcmeutils,看到<symlinkd></symlinkd>标识才算成功;若显示为普通文件夹,说明系统级限制(开发者模式未开、终端非管理员)挡住了 symlink - 改完本地包代码后不生效?先确认 symlink 存在,再检查 OPcache 是否缓存了旧的 autoload 映射 —— 临时关掉或执行
composer dump-autoload
最容易被忽略的是:Windows 下即使配置全对,symlink 仍可能静默失败,最终落回复制模式。这不是 Composer 的 bug,是系统权限层的问题,得单独处理。

















