Composer项目版本管理必须Git标签与composer.lock双锚定,因composer.json改动不提交、不打标、不更新lock则无效;lock文件才是记录精确版本、校验值及依赖路径的确定性快照,install严格按其还原,缺一则环境不一致。

Composer 项目没有“修改稿”概念,版本管理必须靠 Git 标签 + composer.lock 双锚定,否则所谓“保存不同阶段”只是假象。
为什么不能靠 composer.json 改动来存“版本草稿”
改完 composer.json 不提交、不打标签、不生成新 composer.lock,等于什么都没存——composer install 仍会按旧 lock 文件装包,你本地改的约束根本不会生效。Git 也压根不知道你“想升 Laravel”,它只认你 实际提交了什么。
- 删掉某行
require后没运行composer update?那vendor/里包还在,autoload仍能加载 - 加了
"php": "^8.2"但没跑composer install?PHP 版本检查不会触发,直到别人拉代码执行时才爆错 - 把
"monolog/monolog": "^1.0"改成"^2.0"却忘了commit composer.lock?CI 会按旧 lock 装 1.x,和你本地行为完全不一致
composer.lock 是唯一可信的“阶段快照”
composer.lock 不是缓存,是完整依赖图的确定性快照:每个包的精确版本、dist hash、PHP 扩展要求、甚至嵌套依赖的约束来源都记在里面。它才是你所谓“修改稿”真正落地的载体。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 每次
composer install都严格按 lock 装,跳过所有解析逻辑——这是环境一致的底线 - CI 流水线必须用
composer install --no-dev,且composer.lock必须进 Git;漏掉它,等于每次构建都是盲装 - 想回退到“上一阶段”?直接
git checkout到对应 commit,再composer install即可,不需要手动改composer.json
Git 标签才是正式版本的发布动作
你本地 composer.json 里写 "version": "2.1.0" 没用,Packagist 不认;只有轻量 tag v2.1.0 推送到远程,且和 composer.lock 状态匹配,才算真正存下这个“阶段”。
- 打 tag 前务必确认:
composer install能成功、vendor/可运行、composer.lock已提交 - 不要用 annotated tag(
git tag -a v2.1.0),Packagist 对空 message 的 annotated tag 兼容性差 -
dev-main和v2.1.0可共存:前者供内部集成测试,后者供生产环境require,它们在 Packagist 上是并行通道
真正难的不是打几个 tag 或改几行 json,而是让每个“阶段”都有对应的 git commit + composer.lock +(可选)git tag 三件套。少一个,那个“阶段”就不存在于协作语境中。

















