composer没有--no-install选项,正确做法是用composer update --lock仅更新composer.lock而不安装包;若需从头生成,先删除旧lock再执行该命令。

composer install --no-install 不存在,别被名字骗了
Composer 没有 --no-install 这个选项,运行会直接报错:Unrecognized option "--no-install"。这是新手常搜错关键词导致的典型误解——实际想达成“只生成或更新 composer.lock,不下载/安装任何包”,得换用其他组合命令。
用 composer update --lock 替代“仅生成 lock”
这是最接近你目标的操作:它跳过依赖解析和包下载,只根据当前 composer.json 重新生成(或修正)composer.lock,确保 lock 文件与 json 一致,且不碰 vendor/ 目录。
- 适用场景:CI 预处理、提交前校验 lock 是否过期、多人协作中修复 lock 内容偏差
- 不会触发
autoload dump,也不会执行scripts(如post-update-cmd) - 如果
composer.json没改,该命令可能什么也不做;若改了 require 版本但没跑 update,--lock会强制同步 lock - 注意:它仍会读取已有的
composer.lock并尝试复用其中的约束,不是从零生成
想彻底从头生成 lock?删掉旧 lock 再跑 composer update --lock
有时你需要的是“干净重建 lock”,比如切换 PHP 版本后重算平台约束,或怀疑 lock 文件损坏。这时候不能只靠 --lock:
- 先手动删掉
composer.lock - 再执行
composer update --lock - 这会触发一次轻量级依赖解析(只到版本号层面,不下载包),生成全新 lock
- 对比直接跑
composer update:省去所有vendor/操作,速度快得多,也避免因网络或权限问题中断
为什么不用 composer install --dry-run?
composer install --dry-run 看起来像“预演”,但它本质是模拟完整 install 流程:仍会读 lock、计算操作步骤、检查平台要求,甚至尝试解析 autoload,只是最后不写文件。它不保证 lock 被更新,也不解决“json 和 lock 不一致”的问题。
- 常见误用:以为它能生成缺失的 lock —— 实际上如果 lock 不存在,
--dry-run会直接失败并提示No composer.lock file present - 它的输出侧重“将要安装哪些包”,而不是“lock 应该长什么样”
- 在 CI 中用它做预检容易漏掉 lock 同步问题,不如
composer update --lock直接可靠
真正关键的一点是:Composer 的 lock 文件不是“可选副产品”,而是依赖状态的权威记录。哪怕你只想生成它,背后也隐含着解析约束、适配平台、验证版本兼容性这些动作——省不掉逻辑,只能省掉下载和写入 vendor 这两步。别纠结参数名,盯住动词:update --lock 是目前唯一靠谱的路径。










