因为composer将vendor目录设计为完全受控区域,每次install/update都会清空重装,手动创建的软链接必然被删除;正确做法是用path仓库配合"options":{"symlink":true}由composer自动生成维护。

为什么 vendor 目录里的软链接总被 composer install 清掉
不是 Composer 出 bug,是它根本没打算留你手动建的软链接。vendor/ 被设计为完全受控区域,每次 composer install 或 composer update 都会先清空再重装——ln -s ../my-pkg vendor/my-vendor/my-pkg 这种操作,下次运行就没了。
常见错误现象:ls -l vendor/my-pkg 看着还在,但 composer install 后变成普通目录,或直接消失;更糟的是源路径被删了,后续报 No such file or directory。
- 别把软链接当持久化方案——它只是绕过安装流程的临时手段
- 真要本地调试包,必须用
path仓库类型 +"dev-main"版本声明,让 Composer 自己生成并维护软链接 - 若坚持手动
ln,得绑定到post-install-cmd钩子,且脚本里要判断源路径是否存在
path 仓库启用 symlink 的三个硬性条件
写错任意一条,vendor/ 里就是复制副本,改代码不生效,还不会报错。
-
repositories中的url必须是相对路径(如"../my-package")或绝对路径(如"/home/user/my-package"),不能带file://,不能用~,Windows 下必须用正斜杠/或双反斜杠\ - 本地包根目录下要有合法
composer.json,其中name字段(如"acme/utils")必须和主项目require里的完全一致(大小写、斜杠方向都不能差) - 必须在
repositories条目里显式写"options": {"symlink": true}——只在本地包自己的composer.json里设没用
版本号不能写 * 或 ^1.0:path 仓库不走语义化版本解析,只认 dev-main、dev-develop 这类分支别名。写错就 fallback 到 Packagist。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
镜像同步延迟如何影响 symlink 行为
镜像不同步,会导致 composer install 根本拿不到元数据,连 symlink 的机会都没有——它卡在 Downloading provider-*.json 阶段就失败了。
- 新包发布后,阿里云镜像通常要 5–30 分钟才同步完成;期间
composer require acme/utils:dev-main会报Could not find package - 验证是否同步:用
curl -I https://mirrors.aliyun.com/composer/p/acme/utils.json,HTTP 200 且Last-Modified接近当前时间才算到位 -
composer clear-cache不管用——它只删 zip 缓存,元数据缓存存在~/.composer/cache/repo/https---mirrors.aliyun.com-composer下,得手动rm -rf
镜像 URL 少个 / 结尾,比如写成 https://mirrors.aliyun.com/composer,Composer 会拼出 /composerpackages.json 导致 404,然后 fallback 到官方源,整个 path 配置就失效了。
repo.packagist 配置写错导致 symlink 被绕过
很多人配了镜像,却不知道 vendor-dir 或 path symlink 根本没机会生效——因为镜像配置静默失败,Composer 回退到 packagist.org,下载失败直接卡住。
-
repo.packagist键名不能多字母、不能大小写混用(如Repo.Packagist或repos.packagist) - type 值必须是
"composer",不能省略,也不能写成"vcs"或空字符串 - URL 必须以
/结尾,否则拼接路径出错,触发 fallback
验证是否生效:运行 composer config -g repo.packagist,输出应为完整 JSON 对象,含 "type": "composer" 和正确 URL。如果为空或 null,说明配置没写对,但命令本身不报错。










