composer install 只依据 composer.lock 还原依赖,不响应 composer.json 的新增;composer require 才是安全添加新依赖的唯一方式,它同步更新声明、计算依赖、刷新 lock 并安装包。

composer install 只认 composer.lock,不看 composer.json 里新加的包;composer require 是唯一安全添加新依赖的方式——它改声明、算依赖、更新 lock、装进 vendor,四步合一。
composer install 为什么不能用来加新包
你手动在 composer.json 里加了一行 "foo/bar": "^2.0",然后跑 composer install,结果 vendor/ 里根本没有 foo/bar。这不是 bug,是设计使然:install 的唯一输入源是 composer.lock,只要 lock 文件存在且合法,它就完全忽略 composer.json 的任何变更。
- 常见错误现象:改完
composer.json后执行composer install,终端提示Warning: The lock file is not up to date...—— 这不是提醒你“可以继续”,而是明确告诉你:当前安装结果和你刚写的声明不一致 - 如果真想靠
install装上新包,唯一办法是删掉composer.lock再跑,但这样会触发全量重算,所有包都可能升到非预期版本,CI 构建大概率失败 - 生产部署脚本里必须加
--locked参数:composer install --locked。没这个参数,lock 缺失或损坏时会静默 fallback 到update行为,环境漂移就此发生
composer require 才是开发中引入依赖的正路
composer require 不是“装包命令”,它是“声明+局部更新”操作:先写入 composer.json 的 require 字段,再立即对这个包及其子依赖做一次精准 update,最后同步更新 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,或用--no-update参数连写几遍,最后统一composer update --no-interaction - 注意
require-dev场景:加测试工具、代码分析器这类开发期依赖,加-d或--dev参数,例如composer require --dev phpunit/phpunit,它会写进require-dev字段而非require
install 和 require 在 CI/CD 中的分工必须清晰
CI 流水线里混用这两个命令,是环境不一致最常见源头。它们根本不在一个抽象层级上:install 是还原操作,require 是变更操作。
- CI 构建阶段(如 GitHub Actions 的
buildjob)只允许运行composer install --no-dev --locked:确保所有机器装的包版本和composer.lock记录的一模一样 -
composer require只应出现在开发者本地,且每次执行后必须提交更新后的composer.json和composer.lock—— 这两个文件是一体的,漏提任何一个,同事或 CI 拉下来就会出问题 - 如果 CI 报错
Your requirements could not be resolved,别急着require新包,先检查是否有人没提交 lock 文件,或误把require-dev里的包挪到了require字段导致生产环境也试图装测试工具
最容易被忽略的点是:lock 文件不是“生成物”,而是“契约”。它一旦存在,install 就不再有解释权;而 require 每次修改,都在重签这份契约——签得越随意,后续越难履约。

















