composer锁定版本需同时满足:composer.json写死纯数字版本(如"monolog/monolog": "2.9.1")、composer.lock提交至git、所有环境运行composer install——缺一不可,否则版本可能漂移。

Composer 锁版本不是靠某个开关或命令“按住不动”,而是靠 composer.json 里写死精确版本 + composer.lock 提交到 Git + 所有环境统一用 composer install——三者缺一不可。任何一环松动,版本就可能漂移。
怎么在 composer.json 里真正写死一个包的版本
必须用不带任何符号的纯数字字符串,例如 "monolog/monolog": "2.9.1"。写成 "^2.9.1"、"~2.9"、"2.9.*" 甚至 "2.9" 都不算锁定——这些写法会让 Composer 在语义化版本兼容范围内自动升级。
-
"2.9"在不同 Composer 版本中可能被解析为2.9.0或2.9.x,行为不一致,必须写全三位 -
composer require monolog/monolog:2.9.1默认会加^,得手动编辑composer.json删掉符号 - 如果包只在
require-dev里(比如phpunit/phpunit),同样要写死,否则composer update仍会升级它
为什么改了 composer.json 还是升了版本
常见原因是操作链断了:改了 composer.json 却没运行 composer update monolog/monolog 更新 composer.lock;或者虽然更新了 lock,但没提交到 Git;又或者上线时误用了 composer update 而非 composer install。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 本地运行
composer install时提示Your lock file is out of sync,说明composer.json和composer.lock不一致 - CI 构建脚本里写了
composer update(哪怕只是“顺手更新一下”),等于每次构建都重新解析依赖树,lock 文件形同虚设 -
composer install --no-lock会跳过 lock 校验,直接退化为update行为
如何验证锁是否生效
别只看 composer.json,实际装了什么,以 composer.lock 和 composer show 输出为准。
- 运行
composer show monolog/monolog,输出中的versions行显示的是 lock 记录的版本,不是composer.json的约束 - 打开
composer.lock,搜索包名,确认"version": "2.9.1"(注意是否带v前缀或+git后缀) - 再运行一次
composer update monolog/monolog,如果提示Nothing to install or update,才算锁成功 - CI 中可用
git diff --exit-code composer.lock检查 lock 是否被意外修改
容易被忽略的硬性前提
即使 composer.json 和 composer.lock 都写死了,PHP 版本或平台配置不匹配也会导致 composer install 失败——这不是版本漂移,而是校验失败。
-
composer.json里若写了"platform": {"php": "8.2"},而目标环境是 PHP 8.1.12,且启用了platform-check,安装就会中止 -
composer update --lock看似安全,但它会重写composer.lock,比如调整字段顺序或 hash 格式,导致无关 diff 出现 - 手动修改
composer.lock极易出错:dist下的sha256没同步更新,下次install就会报Invalid checksum










