Composer 的 path 仓库仅限本地开发联调,CI/CD 中必须替换为 vcs 或私有仓库;它仅在 composer update(或带 --with-all-dependencies 的 install)时生效,且需目标目录含匹配 name 和分支的 composer.json,并显式配置 symlink 选项才能软链接。

Composer 的 path 仓库不是“共享代码”的通用方案,而是专为本地模块联调设计的开发期机制;它在 CI/CD 或多环境部署中会直接失效,必须提前切换为 vcs 或私有仓库。
path 仓库只在本地 composer update 时生效
执行 composer install 不会触发 path 仓库的软链接或复制行为——只有 composer update(或带 --with-all-dependencies 的 install)才会读取 repositories 并处理 path 条目。很多团队误以为写进 composer.json 就能自动生效,结果上线构建失败,就是因为 CI 脚本用了 install 而非 update。
- path 仓库的 url 必须是相对路径,从当前
composer.json所在目录起算,不能用~/、/abs/path或环境变量(如${HOME}) - 目标目录(如
../user-sdk)下必须存在合法composer.json,且其中name字段要和主项目require中的包名完全一致 - 版本约束(如
"dev-main")必须匹配目标目录的实际分支名;写成"*"或"dev-develop"却只有main分支,就会报Could not find package
软链接需显式启用,且仅对 update 生效
默认情况下,path 类型仓库会把源目录「复制」到 vendor/,改代码不生效。要改成符号链接,必须满足两个条件:
- 在被引用的本地包(如
../user-sdk/composer.json)中添加:"options": {"symlink": true} - 运行
composer update vendor/myorg-user-sdk(注意不是install),且 Composer 版本 ≥ 2.2
如果执行后 ls -la vendor/vendor/myorg-user-sdk 仍显示普通目录而非箭头链接,检查是否漏了 options,或该包的 composer.json 没被正确识别(比如文件编码错误、JSON 格式非法)。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
CI 构建和生产环境必须移除 path 配置
path 仓库本质是“本地磁盘路径依赖”,CI 流水线拉取代码后,根本不存在 ../user-sdk 这个路径,composer install 直接报错中断。上线前必须:
- 从主项目
composer.json的repositories数组中删掉所有"type":"path"条目 - 把
require中的开发版(如"dev-main")换成真实版本(如"^1.2"),并指向私有仓库(vcs或artifact) - 提交更新后的
composer.lock—— 否则旧 lock 文件仍含 path 源信息,CI 会尝试解析已删除的配置
常见翻车点:团队共用同一份 composer.json,有人本地加了 path 却忘了删,导致整个发布流水线卡在依赖安装阶段。
比 path 更稳定的替代方案:vcs + 私有仓库
若目标是“多项目代码共享”,path 仅适合单人快速验证;长期协作应直接走 vcs 类型仓库:
- 每个模块单独建 Git 仓库(如
git@github.com:myorg/user-sdk.git) - 主项目
composer.json中配置:{"type":"vcs","url":"git@github.com:myorg/user-sdk.git"} - require 写稳定版本(如
"myorg/user-sdk": "^2.0"),靠 Git tag 管理发布 - 搭配私有 Packagist 或 Satis,统一索引内部包,避免硬编码 SSH 地址
这样既支持本地开发(checkout 后 composer update 拉最新 dev 分支),又天然兼容 CI 和多环境部署,不用每次上线前手动切配置。

















