composer update --lock 是唯一能仅重算并更新 composer.lock 文件的命令,它根据 composer.json 重新解析依赖关系并写入新 lock,不安装包、不修改 vendor。

composer update --lock 只更新 lock 文件不装包
这是最直接满足“只更新 composer.lock”需求的方式。它会重新解析 composer.json 中的约束,生成新的依赖图,写入 composer.lock,但跳过下载、解压、安装、自动加载器重生成等所有实际变更操作。
常见错误是误用 composer install --dry-run —— 它只模拟安装已有 lock 的过程,不会根据新规则重算依赖,也就无法反映 composer.json 修改后的最新兼容性结果。
- 适用场景:改了
composer.json(比如调整了 PHP 版本、加了新 require、放宽了某包版本范围),想先看 lock 会怎么变,再决定是否真正执行composer update - 它不检查本地 vendor 是否存在,也不校验已安装包版本,纯属“重算锁文件”
- 如果
composer.json没改动,composer update --lock实际什么都不会写入,lock 文件保持原样
composer install --dry-run 不等于只更新 lock
composer install --dry-run 是在已有 composer.lock 基础上,模拟一次完整安装流程:读 lock、比对 vendor、计划下载/更新/删除包、生成 autoloader 草稿……但它不会写任何文件,也不会联网拉包。
关键区别在于:它完全不碰 composer.json 的变更,lock 文件内容被视为唯一权威。所以哪怕你刚把 "monolog/monolog": "^2.0" 改成 "^3.0",--dry-run 也只会告诉你“按当前 lock,要装这些包”,而不是“按新 json,lock 应该长这样”。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 错误现象:执行后发现 lock 没变、vendor 也没动,但以为自己“预览了升级效果”——其实只是预览了当前 lock 的安装动作
- 它会触发插件钩子(如
pre-install-cmd),但跳过实际执行;某些插件可能因此报错或行为异常 - 网络不通时,
--dry-run仍能跑完(因为不下载),但若 lock 里有 git 引用且插件尝试解析远程分支,就可能卡住
为什么不用 composer update --dry-run?
因为 composer update --dry-run 并不存在。Composer 官方不支持这个 flag,强行加会报错:Unrecognized option: --dry-run。这是很多人搜教程时踩的第一个坑——把 install 的参数习惯性套到 update 上。
真正想“预演 update 效果”,只有两个可靠路径:
- 先用
composer update --lock得到新 lock,再用git diff composer.lock看差异 - 或者干脆在干净目录下跑
composer update --no-install(注意不是--dry-run),它会更新 lock 并输出将要安装的包列表,但不装包 -
--no-install和--lock都是真实命令,文档里有,但容易被忽略
lock 文件更新后没生效?检查这三点
改完 lock 以为万事大吉,结果 CI 报错或本地 composer install 行为异常,大概率是以下某个环节断了链:
- 没提交
composer.lock:Git 忽略了它,或 commit 时漏掉,导致别人拉下来还是旧 lock - PHP 版本不匹配:新 lock 里记录了
"platform": {"php": "8.2"},但本地 PHP 是 8.1,composer install会拒绝按 lock 安装(报Your lock file does not contain a compatible set of packages) - 用了
composer update --lock --with-dependencies这类组合但没理解含义:它只影响哪些包参与重算,不改变“只写 lock”的本质;但若误加--with-all-dependencies,可能意外升级间接依赖,让 lock 变得比预期更激进
lock 文件不是快照,是确定性安装契约。每次更新它,都意味着你主动承担了验证新版依赖组合的责任——这点最容易被跳过。










