composer install 严格按 composer.lock 还原依赖,不读取 composer.json 的新约束、不更新 lock 文件;它只安装 lock 中锁定的精确版本,是 CI/CD 和生产部署保障环境一致的核心机制。

composer install 只还原,不修改依赖声明
它只看 composer.lock 文件,严格按里面记录的每个包名和精确版本号去下载、解压、写入 vendor。哪怕你刚在 composer.json 里加了一行 "foo/bar": "^1.0",只要 composer.lock 还存在且合法,composer install 就完全无视那行新增——它不是“安装当前声明”,而是“还原上次锁定的状态”。
常见错误现象:
-
composer install后composer.lock时间戳变了、内容有增删 → 实际是 lock 和 composer.json 不兼容(比如删了包但没清理 lock),Composer 在“修复”而非“更新” - CI/CD 中漏掉
--locked参数 → 若 lock 缺失或格式异常,它会悄悄 fallback 到按 composer.json 重生成 lock,导致环境漂移
所以部署脚本里必须写成:composer install --locked。失败就失败,绝不自作主张。
composer require 是“改声明 + 局部重算”
它干两件事:先往 composer.json 的 require 或 require-dev 字段里追加一行(比如 "monolog/monolog": "^3.0"),再立即执行一次等效于 composer update monolog/monolog 的操作——即只重算这个包及其子依赖,更新 composer.lock 并装进 vendor。
使用场景明确:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 开发中引入新库,比如加日志、加 HTTP 客户端
- 升级单个包(
composer require monolog/monolog:^3.0等价于先改 JSON 再 update) - 不能用于批量装包:没有
composer require a/b c/d e/f这种语法;要批量,得用--no-update多次 require,再统一composer update --no-interaction
为什么不能用 install 替代 require 来加新包
因为 composer install 根本不解析 composer.json 的变更。你手动编辑 JSON 加了包,再跑 install,它依然只按旧 lock 装——新加的那行声明被彻底忽略。只有两种办法能让新包落地:
- 删掉
composer.lock,再跑composer install(危险!会重算全部依赖,版本不可控) - 用
composer require(安全,局部更新,lock 自动同步)
顺带一提:composer require 触发的 warning(如 Package xxx is abandoned)只出现在 install/update 时,require 本身不检查已装包是否废弃——它只管自己新加的这个。
容易被忽略的细节:lock 文件的“权威性”边界
composer.lock 锁的是“包名+精确版本+dist source+checksum”,但它不锁 PHP 版本、扩展要求、甚至不锁 composer.json 里写的 config 或 scripts。也就是说:
- 你把 PHP 从 8.1 升到 8.3,
composer install --locked仍会成功,哪怕某个 lock 里的包实际不兼容 8.3 -
"replace": {"old/package": "*"}这种声明只影响 Composer 的安装逻辑,不提供任何类或功能——别指望它能“替代”废弃包的运行时行为
真正可靠的约束,得靠 composer.json 里的 "php": "^8.1" 和 CI 中显式校验,而不是依赖 lock 文件的完整性。

















