ci/cd构建失败常因git错误合并composer.lock导致json非法,根本解法是在.gitattributes中配置merge=ours或merge=theirs策略,并确保镜像源与platform配置正确生效。

CI/CD 构建失败常因 composer.lock 被 Git 错误合并
Git 默认把 composer.lock 当普通文本处理,用三方合并算法(如 recursive)去“拼接” JSON,结果产出非法结构——比如重复的逗号、缺引号、字段错位。这不是 Composer 报错,是 JSON 解析直接失败:JSON decode error: Syntax error。根本原因不在 CI 配置,而在项目没告诉 Git “这个文件不准合并”。
- 在项目根目录加
.gitattributes文件,写入:composer.lock merge=ours(主干优先)或composer.lock merge=theirs(功能分支优先) - 执行
git add .gitattributes && git commit -m "lock file merge strategy",确保所有 CI runner 拉取到该配置 - 验证是否生效:本地模拟冲突
git merge --no-commit feature-branch,再git status—— 若composer.lock不显示为 “both modified”,说明策略已起效
构建时 vendor 目录不一致?先确认镜像源是否真正生效
CI 日志里看到 Downloading https://packagist.org/packages.json,说明镜像没走通。composer.lock 里存的是 dist URL 和哈希,但镜像只代理元数据(packages.json),不重写 dist 下载地址。如果 lock 文件是用官方源生成的,即使你配了阿里云镜像,composer install 仍会直连 GitHub 或 packagist.org。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 切镜像前必须删掉
vendor/和composer.lock,再跑composer install --no-cache -v -
composer.json中的repositories必须是数组,且第一项必须是{"packagist.org": false},不能合并到下一项里 - CI 脚本中加一行验证:
composer install -vvv 2>&1 | grep "mirrors.aliyun.com",没输出就说明镜像未命中
为什么 CI 总提示 “lock file is not up to date with composer.json”
这个报错不是锁文件损坏,而是 composer.json 被改过(比如调整了 config.platform.php 或增删了 require),但 composer.lock 还没同步更新。CI 严格校验两者一致性,拒绝降级风险。
- 开发提交前,在 feature 分支运行
composer update --lock(不下载包,只重算哈希和 content-hash) - 禁止在 CI 中执行
composer update;它会触发完整依赖解析,不可控且慢 - 若已报错,最稳做法是:在 CI 脚本开头加
composer update --lock --no-interaction,再继续install—— 但需确保composer.json已无冲突且平台配置正确
多环境部署时 lock 文件内容一致,但 vendor 行为不同
常见于 macOS 开发 + Linux 生产,或 PHP 8.2 本地 + PHP 8.1 CI。composer.lock 确实锁定了包版本,但它不锁定平台选包结果——比如 ext-intl 缺失时,某些包会 fallback 到纯 PHP 实现,行为可能不同。
- 在
composer.json的config段显式声明目标平台:"platform": {"php": "8.1.0", "ext-intl": "1.0"} - CI 中运行
composer show --platform,确认输出与声明一致;不一致说明config.platform未生效或被全局配置覆盖 - 避免使用
--ignore-platform-reqs:它只是跳过检查,不解决底层兼容性,运行时可能爆ParseError: unexpected token "match"
merge=ours,如果两个分支各自升级了互斥依赖(比如 A 升了 Laravel 10,B 升了 Laravel 11),CI 依然会装出错误的依赖树——这时必须人工介入,靠 composer show --tree 和 composer update --dry-run 验证。










