必须用composer update才能生效,因install仅读lock文件、跳过repositories解析,不创建软链接;path仓库需url、name、options.symlink三者严格匹配且版本写dev-main或*,否则静默fallback为拷贝。

自定义仓库(如 path、package、composer)配置后,必须用 composer update 才能生效;composer install 完全忽略新仓库,也不会重建软链接或拉取新版本。
为什么 composer install 不触发自定义仓库同步
composer install 只读 composer.lock,跳过所有 repositories 配置解析。哪怕你刚在 composer.json 里加了 "type": "path",只要 lock 文件里还存着 Packagist 的 dist URL,它就照旧复制包,根本不会访问你的本地目录或私有源。
这导致两个典型现象:
- 改完
repositories后运行composer install,vendor 里仍是旧包,甚至还是 ZIP 解压出来的 - 本地 path 包改了代码,但
composer install后 vendor 目录没变——因为根本没走 symlink 流程
path 仓库软链接不生效的三个硬性条件
软链接不是“配了就自动有”,而是 Composer 在 update 阶段按三要素严格匹配:缺一不可,且不报错,只静默 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 下必须用正斜杠/或双反斜杠\ -
name字段(在repositories条目里)和本地包composer.json中的name必须逐字节一致(大小写、斜杠方向都不能差) - 必须显式声明
"options": {"symlink": true}—— 放在主项目composer.json的repositories条目里,放本地包自己的composer.json或全局config里都无效
更新后如何验证是否真用了自定义仓库
别信终端输出的 Symlinking 日志,它可能只是缓存提示。关键看 vendor/vendor-name/package-name 是不是符号链接:
- macOS / Linux:
ls -la vendor/acme/utils,输出含->才算成功 - Windows:
dir vendorcmeutils,看到<SYMLINKD>标识 - 如果显示普通目录,说明 fallback 成拷贝了——回头检查上面三个条件,尤其
name是否大小写一致、url路径是否可访问、Git 分支名是否为dev-main(不是dev-master)
镜像源 + 自定义仓库混用时的元数据刷新
当项目同时配置了中文镜像(如阿里云)和自定义 path 或 package 源,composer update 默认仍会查镜像的 packages.json,但自定义源不依赖镜像——所以新包发布后卡住,大概率是镜像元数据没刷新,而非自定义源问题。
- 确认当前生效镜像:
composer config -g repos.packagist.url(注意是复数repos) - 强制丢弃镜像元数据缓存(Composer ≥ 2.5):
composer update --refresh,它只删packages.json和provider-*.json,不碰 ZIP 包 - 老版本(≤ 2.4)需手动删缓存:
rm -rf $(composer config --global cache-dir)/repo/https---mirrors.aliyun.com-composer - 若项目
composer.json里有repositories字段,它会完全屏蔽全局镜像配置——此时要查composer config repos.packagist.url(不加-g)
真正容易被忽略的是:自定义仓库的版本匹配逻辑和镜像源完全独立。path 源只认 dev-main 或 *,写 ^1.0 就直接失效;而镜像延迟是服务端轮询机制决定的,客户端只能重拉,不能“触发同步”。两套机制叠加时,先分清问题是出在本地路径配置,还是远程元数据没更新。

















