composer.lock冲突是依赖树真实不一致,非git误报;必须先统一composer.json,再执行composer update --lock重建锁文件,禁用手动编辑或--no-lock,否则破坏content-hash导致环境漂移。

composer.lock 冲突不是 Git 误报,是依赖图真实不一致
Git 标出 composer.lock 冲突,基本意味着两个分支安装出的依赖树确实不同——不是格式或空格问题,而是 content-hash、dist.sha256、甚至 packages-dev 的完整结构已不可逆地偏离。Composer 2.x 起每次 composer update 都会重写整个文件,字段顺序、换行、哈希值全变,PHP 小版本(如 8.1.22 vs 8.1.25)或 Composer 版本差异也会触发重写。
常见错误现象包括:
-
JSON decode error: Syntax error:合并标记残留,直接破坏 JSON 合法性 -
Invalid archive signature:某个包的dist.sha256被手工改错,校验失败 - CI 报
The lock file does not contain the required package "xxx":--ours强行保留某方 lock,但对方composer.json新增的包没写入
冲突发生后唯一安全的操作是 composer update --lock
composer install 是“按 lock 装”,它拒绝处理已损坏或不匹配的 lock;而 composer update --lock 是“按当前 composer.json 重算快照”,完全不读旧 lock,只依赖 clean 合并后的 composer.json 生成全新合法文件。
执行前必须确认:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer.json已无冲突(手动整合或git checkout --theirs composer.json) - 删掉本地
composer.lock和vendor/(避免缓存干扰) - 运行
composer update --lock,理想输出是Lock file operations: 0 installs, 0 updates, 0 removals - 若输出含大量
Updating xxx,说明composer.json还没拉齐,得先git pull origin main
为什么禁用 --no-lock 和手动合并是定时炸弹
composer install --no-lock 在 CI 中看似绕过冲突,实则让环境彻底失控:线上装的包和本地开发机可能差好几个小版本,安全补丁漏上、间接依赖意外升级、半夜报错无法复现。
Git 的 checkout --ours 或在线 JSON 美化工具更危险:
- 选错
--ours可能丢掉require-dev信息,导致phpunit不装,CI 通过但本地测试跑不起来 - JSON 美化重排字段顺序,
content-hash失效,后续composer install静默跳过校验,运行时类找不到 -
.gitattributes设merge=ours只是掩盖问题,不能替代composer.json同步
预防比解决更重要:让 lock 冲突变“稀有”
高频冲突本质是节奏失控,不是技术问题。关键动作必须落地:
- 在
composer.json加"config": {"sort-packages": true},再跑一次composer update --lock提交——消除 70% “假冲突”(内容相同但顺序不同) - 所有依赖变更:先改
composer.json→ 立即composer update --lock→git add composer.json composer.lock一起提交 - CI 加两道硬校验:
composer validate --strict+composer install --dry-run,失败即阻断 PR 合并 - 部署脚本禁用
--no-lock,统一用composer install --no-interaction --optimize-autoloader
真正难的不是命令怎么敲,而是所有人对“谁来决定依赖版本”达成共识——composer.json 是唯一源,composer.lock 是它的哈希快照,不是可编辑配置文件。










