composer.json写"2.9.1"不等于真锁死,必须满足纯数字三位完整版本、无符号无空格,且需提交composer.lock并统一执行composer install,三者缺一不可;否则仍会漂移。

composer.json里写"2.9.1"不等于真锁死
中文镜像环境下,很多人改完composer.json就以为版本锁死了,结果composer install还是装了2.9.2。根本原因不是镜像问题,而是写法错误:"monolog/monolog": "2.9.1"必须是纯数字、三位完整、无空格、无符号——不能是"2.9"、"2.9.*"、"^2.9.1",甚至不能是"2.9.1 "(末尾带空格)。镜像只是加速下载,不改变版本解析逻辑。
常见错误现象:
-
composer show monolog/monolog输出2.9.2,但composer.json明明写了"2.9.1" -
composer update monolog/monolog提示Nothing to install or update,但全量composer update时它又升了
验证是否真锁死:运行composer show monolog/monolog,看versions行是否严格等于你写的字符串(注意有无v前缀、+git后缀);再检查composer.lock里搜索包名,确认"version": "2.9.1"字段存在,且"source": {"reference": "abc123..."}是确定 commit hash,不是dev-main之类动态引用。
composer.lock被.gitignore过滤或没提交=白锁
中文团队协作中90%的“依赖不一致”不是 Git 合并出错,而是composer.lock没提交、被.gitignore过滤、或 CI 脚本偷偷用了composer update。一旦composer.lock缺失,composer install就会退化为重新跑 SAT 求解器——哪怕composer.json完全一样,也可能装出不同版本的psr/log或guzzlehttp/psr7。
强制校验对齐的做法:
- 在
composer.json顶层加"config": {"lock": true},这样只要composer.json和composer.lock不匹配,composer install立刻报错,例如The lock file does not contain the required package "guzzlehttp/guzzle" - CI 第一步必须检查:
ls -la composer.lock确认文件存在,再比对git log -1 --format=%H -- composer.lock确保它来自当前 commit - GitHub Actions 中显式设
cache: false,否则可能读到上个分支缓存的过期composer.lock
dev-main#abc123才是真锁定,dev-main不是
写"monolog/monolog": "dev-main"不是锁定,是放任漂移——每次composer update都可能拉最新 HEAD。中文环境下尤其危险:有人提 PR 改了 main 分支,你本地composer install就可能装上完全不同的代码。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
真正锁定某次提交,必须用dev-main#abc1234格式(abc1234是实际 commit hash)。分支名含斜杠(如feature/login-flow)需 URL 编码为feature%2Flogin-flow,否则解析失败。
别信composer require monolog/monolog:dev-main#abc1234——它默认加^,得手动打开composer.json删掉那个插入符。改完后必须立刻执行composer update monolog/monolog --with-dependencies,否则composer.lock仍记录着老版本。
PHP版本不一致会让composer.lock失效
Composer 2.0+ 默认校验platform配置(如"php": "8.1.10")。当生产服务器从 PHP 8.1 升级到 8.2,即使composer.lock文件本身没动,composer install也会因平台约束不满足而拒绝执行,或触发重新解析(尤其加了--ignore-platform-reqs时)。
必须同步检查的三项:
-
composer.json中config.platform.php是否显式声明了目标 PHP 版本(推荐写死,如"8.2.12") - 服务器实际 PHP 版本是否与
lock文件里platform字段完全一致(小版本也要对得上) - 所有声明的扩展(如
"ext-gd": "*")是否已在服务器上启用,用php -m可验证
最容易被忽略的是:镜像源本身不参与平台校验,但composer install失败时,错误日志里不会直接说“PHP 版本不对”,而是报Root composer.json requires php ^8.2 but this PHP version does not satisfy it——这个php指的是composer.lock里记录的 platform 声明,不是你当前 CLI 的 PHP 版本。










