composer install 仅按 composer.lock 精确还原依赖,不解析 composer.json 新增;composer require 则原子化地修改 composer.json、局部重算依赖、更新 lock 并安装包,是安全添加新依赖的唯一正确方式。

composer install 和 composer require 不是替代关系,而是分工明确:前者只还原,后者才真正“加新包”。用错命令会导致依赖没装上、lock 文件不一致、CI 环境漂移。
composer install 只认 lock 文件,完全无视 composer.json 的新增
它不解析 composer.json 里新加的包声明。哪怕你手动在 require 字段里加了 "guzzlehttp/guzzle": "^7.0",只要 composer.lock 还存在且合法,composer install 就只会按 lock 里旧的版本列表去装——新加那行等于白写。
- 常见错误现象:
composer install后 vendor 里没出现新包,但composer.json明明写了 - 部署时漏加
--locked参数 → 如果 lock 缺失或损坏,它会悄悄 fallback 到按composer.json重生成 lock,导致线上环境版本失控 - 正确姿势:CI/CD 脚本必须写成
composer install --locked,失败就中断,不自动兜底
composer require 是“改声明 + 局部更新”的原子操作
它干两件事:往 composer.json 的 require(或加 --dev 写进 require-dev)里追加一行,再立刻执行等效于 composer update vendor/package 的局部依赖重算,同步更新 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) - 不能批量:没有
composer require a/b c/d这种语法;要装多个,得分别require或先写 JSON 再composer update - 注意 warning:废弃包提示(
Package xxx is abandoned)只在 install/update 阶段触发,require本身不检查已装包状态
为什么不能删 lock 后用 install 替代 require
删掉 composer.lock 再跑 composer install,确实会按当前 composer.json 重装全部依赖,但它不是“安全加包”,而是“全量重算”——所有包都可能升到满足约束的最新版,连间接依赖也一并变,极易引发兼容性问题。
- 风险点:
phpunit升级可能让测试挂掉,symfony/http-foundation版本跳变可能破坏中间件逻辑 - 更隐蔽的问题:不同机器上
composer install(无 lock)结果可能不一致,因为 packagist 的包发布时间、镜像同步延迟会影响解析结果 - 真正安全的做法只有一个:
composer require vendor/package:version,它只动目标包及其子依赖,其余不动
最常被忽略的其实是 composer.lock 的权威边界:它只管“装什么版本”,不管“怎么 autoload”或“脚本怎么跑”。一旦你改了 autoload 或 scripts 字段,install 和 update 都不会重新生成 autoload 文件——得手动跑 composer dump-autoload。










