生产环境必须用 composer install 而非 composer update,因前者仅按 composer.lock 精确安装,后者会重新解析依赖;锁版本需满足:composer.json 中版本号为纯数字字符串(如 "1.2.3")、lock 文件记录 exact 版本及 commit hash、php 平台配置与服务器完全一致,并配合 --no-dev 等参数严格部署。

composer install 才是真正锁定版本的命令
生产环境必须用 composer install,不是 composer update。前者跳过所有版本解析,只读 composer.lock 里的 commit hash、ZIP URL 和 exact version,直接解压安装;后者会重新跑依赖求解器,哪怕你只改了一个包,也可能连带升级其他依赖。
常见错误现象:CI 日志里出现 Resolving dependencies —— 这说明 composer install 已退化为隐式 update,根本原因是:composer.lock 缺失、被 .gitignore 忽略,或 composer.json 新增了 require 但没更新 lock。
- 部署脚本里写死
composer install --no-dev --optimize-autoloader --classmap-authoritative,别省参数 - Dockerfile 中不能只写
composer install,基础镜像里的环境变量不可信 - CI 缓存 key 必须包含
--no-dev状态,否则可能混装 dev 包
composer.json 里写 "1.2.3" 不等于锁死
双引号里的 "1.2.3" 默认会被 Composer 解析为 ^1.2.3(允许补丁和次要版本升级)。真正锁死必须满足两个条件:字符串不含任何运算符,且 composer.lock 里记录的是该 exact 版本。
正确写法:"monolog/monolog": "1.2.3";错误写法:"monolog/monolog": "^1.2.3"、"monolog/monolog": "~1.2.0"、"monolog/monolog": "1.2"(末尾缺第三位)、"monolog/monolog": "v1.2.3"(带 v 前缀)。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 执行
composer require monolog/monolog:1.2.3后,立刻打开composer.json确认是否为纯数字字符串 - 再检查
composer.lock中对应项的version字段是否为"1.2.3",source.reference是否为确定 commit hash - 本地改完
composer.json后,必须运行composer update monolog/monolog更新 lock,否则等于白改
--no-dev 不是“保险丝”,而是开关条件
--no-dev 只控制是否安装 require-dev 和加载 autoload-dev,它不干预主依赖的版本行为。如果 composer.lock 里本身存了 phpunit/phpunit 的记录,加了 --no-dev 也不会跳过 autoload-dev 路径注册,可能引发 Function already defined 或类加载冲突。
- CI 构建前必须先跑
composer update --no-dev --lock,确保 lock 文件里不含 dev 包条目 - 验证方式:部署后执行
ls -l vendor/phpunit,目录不存在才算生效 -
COMPOSER_DEV_MODE=0在 Composer 2.9.6+ 已移除,设了也无效
PHP 版本变更会让 composer.lock 失效
Composer 2.0+ 默认校验 platform 配置。服务器 PHP 从 8.1.12 升到 8.2.0,即使 composer.lock 没动,composer install 也会报错退出,或触发重新解析(尤其加了 --ignore-platform-reqs 时)。
- 必须显式在
composer.json的config.platform.php写死目标版本,如"8.2.12" - 上线前用
php -v和php -m | grep gd核对实际 PHP 版本和扩展启用状态 - lock 文件里的
platform.php字段必须与服务器完全一致,小版本也要对得上
最容易被忽略的点是:composer.lock 提交了,但 CI 流水线里用了 composer update;或者 PHP 小版本不一致,却误以为只是 warning 可忽略。锁不是靠单个动作生效的,是 composer.json 精确写法 + composer.lock 提交 + composer install 命令 + 平台环境四者严丝合缝的结果。










