composer install 从不更新包,其唯一职责是精确还原 composer.lock 记录的依赖状态;它忽略 composer.json 的版本约束,不进行任何版本求解,修改 json 后必须运行 composer update vendor/package-name 才能局部更新。

composer install 不能只更新单个包,它只按 composer.lock 安装固定版本,任何“更新”行为都属于误判。
为什么 composer install 从不更新包
composer install 的唯一职责是还原 composer.lock 所记录的精确依赖状态。它不读取 composer.json 中的版本约束,也不做任何版本求解或升级决策。
- 即使你改了
composer.json里某个包的版本(比如把"monolog/monolog": "^2.8"改成"^2.10"),composer install依然装 lock 文件里记着的旧版(比如2.8.0) - 如果
composer.lock和composer.json不一致(比如有人删了 lock 文件又没跑 update),composer install会直接报错:Composer could not find a composer.lock file - 想让修改生效?必须先运行
composer update vendor/package-name,它才会重算并写入 lock 文件
composer update vendor/package-name 才是真正“局部更新”的命令
这是唯一能精准控制变更范围的原生命令,行为明确、副作用可控。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 只解析目标包及其
require字段声明的依赖,不会扫描整个依赖树 - 若目标包的新版本要求
psr/log ^2.0,而当前 lock 里是1.1.4,则psr/log会被连带升级——这是必要求解,不是失控 - 其他未被该包直接 require 的包(如
guzzlehttp/guzzle),只要没出现在它的composer.json里,就不会动 - 执行前加
--dry-run:运行composer update monolog/monolog --dry-run,看输出里有没有你不打算碰的包名(尤其是symfony/、laravel/类顶层包)
常见误操作与对应后果
很多“以为在局部更新”的操作,实际触发的是全量或不可控行为。
- 敲
composer update(无参数)→ 全量重算所有包,lock 文件里 90% 的条目都会变 - 用
composer require vendor/package:version→ 先改composer.json,再隐式执行install,可能拉进新依赖、改变依赖层级 - 手动编辑
composer.lock→ Composer 下次 run 时会校验失败,报lock file is not up to date - 加不存在的参数如
--only或--with-dependencies→ 直接报错:[InvalidArgumentException] Unknown option
真正需要“只动一个包”的场景怎么处理
没有绝对隔离的更新,但可以极大压缩影响面。
- 先查依赖树:
composer show vendor/package-name,重点关注它 require 哪些包、哪些又和你的其他顶层包共用 - 若共用关键包(如
symfony/console),且你不想让它动,在composer.json里显式锁定:"symfony/console": "^5.4" - 强制重装(绕过版本比较):
composer reinstall vendor/package-name(Composer 2.2+),老版本得拆成composer remove+composer require - 协作时务必提交更新后的
composer.lock,否则别人install的是旧组合,测试结果不可信
最易被忽略的点:所谓“局部更新”,本质是让 Composer 在约束允许范围内做最小求解。它不会跳过依赖兼容性检查,也不会绕过 PHP 版本、扩展等平台要求——这些不是配置项,是求解器的硬边界。










