CI/CD 中 composer.lock 冲突导致发布失败时,应立即停用自动合并、删除冲突文件并执行 composer update --lock 重建;因 Git 合并标记或格式差异会引发 JSON 解析错误或哈希不匹配,进而导致运行时类找不到等故障。

CI/CD 流水线里 composer.lock 冲突导致发布失败,必须停掉所有自动合并尝试,删掉冲突 lock 文件,立即执行 composer update --lock 重建——它不改依赖版本,只按已合并干净的 composer.json 生成合法快照。
为什么 CI 报 “JSON decode error” 或 “mismatched hash” 就该立刻中止构建
Git 合并后残留的 <<<< HEAD、=======、>>>> origin/main 标记会直接让 PHP 的 json_decode() 失败;即使你用脚本自动清理了这些标记,只要 packages 数组顺序、字段缩进或空行不同,content-hash 就会失效——后续 composer install 可能跳过校验,但线上运行时突然报 Class not found 或 Call to undefined method。
常见诱因包括:
- 本地开发机 PHP 版本是
8.2.10,CI 使用8.2.15,导致platform字段被重写,触发假冲突 - 两人同时加包但没启用
"sort-packages": true,packages列表顺序相反,Git 标为全文件冲突 - CI 缓存了旧版
composer.lock,实际读的不是当前 PR 提交的那份
CI 脚本里必须加的三道防线
别等失败再救火。在 .github/workflows/deploy.yml 或 .gitlab-ci.yml 开头就嵌入验证逻辑:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 显式检查
composer.lock是否存在且未被 Git 标记为冲突:test ! -s composer.lock || grep -q '<<<< HEAD' composer.lock && exit 1 - 运行
composer validate --strict,它会拒绝含格式错误或字段缺失的 lock 文件 - 禁用 vendor 缓存,或强制设
cache: false(GitHub Actions)或cache: { key: $CI_COMMIT_SHA }(GitLab CI)
部署命令必须是:composer install --no-interaction --optimize-autoloader --no-dev,绝不能带 --no-lock。
冲突发生时 CI 中最安全的重建流程
前提:PR 已通过 git merge 或 rebase 整合好 composer.json,且人工确认新增/删除的包语义正确。
- 第一步:删掉当前
composer.lock(可先mv composer.lock composer.lock.bak) - 第二步:运行
composer update --lock—— 注意不是composer update,也不是composer install - 第三步:检查输出是否为
Lock file operations: 0 installs, 0 updates, 0 removals;如果出现大量Updating xxx,说明composer.json还没真正拉齐,需退出并阻断构建
重建后的 composer.lock 必须立刻 git add 并提交,否则下一次构建还会踩同一个坑。
本地和 CI 环境不一致时最容易忽略的一点
别急着删 lock 文件。先运行 composer show --platform,对比本地、CI 和生产环境输出的 php、ext-intl、lib-curl 版本是否一致。若不一致,composer update --lock 生成的仍是“带偏见”的快照——比如 CI 里 ext-intl 缺失,platform-check 会跳过某些包,但本地却装上了。统一 Dockerfile 的 FROM 或 .php-version 才是根治手段。

















