composer install 默认不更新 composer.lock,仅按其内容安装依赖;若 lock 被修改,主因是 lock 缺失、与 composer.json 不一致或使用了触发重生成的参数。

composer install 时跳过更新 composer.lock
默认情况下,composer install 只会按 composer.lock 中记录的版本安装依赖,**不会重新解析或修改 lock 文件**——也就是说,它本来就不执行 update。如果你发现 lock 文件被改了,大概率是误用了 composer update,或者触发了某些隐式行为。
常见错误现象:composer install 执行后 composer.lock 时间戳变了、内容有增删,甚至提示 “Lock file is not up to date”。这通常是因为:
-
composer.json被手动改过(比如加了新包但没运行composer update),导致 Composer 自动“修复” lock 文件以对齐 - 项目里存在
composer.lock缺失,而composer install在无 lock 时会退化为composer update --no-interaction - 用了
--dry-run或--ignore-platform-reqs等参数干扰了判断逻辑(少见但可能)
如何确保 install 绝对不碰 lock 文件
核心原则:保证 composer.lock 存在 + 内容与 composer.json 兼容 + 不带任何触发重生成的选项。
- 确认
composer.lock已提交到代码库,且未被本地修改(git status看不到它) - 运行前检查:
composer validate --strict,避免 JSON 格式或 schema 错误导致 Composer 强制重建 lock - 显式禁止自动修复:加
--no-scripts(防 post-install-cmd 意外触发 update)、--no-plugins(防第三方插件干预) - 最保险命令:
composer install --no-interaction --no-scripts --no-plugins
为什么有时候 install 还是会改 lock
不是 Composer “想改”,而是它检测到 composer.lock 和 composer.json 存在不可忽略的不一致,比如:
-
composer.json里删了一个 require 包,但 lock 文件里还留着对应条目 → Composer 会清理掉 - PHP 版本约束变了(如从
"php": "^7.4"改成"php": "^8.1"),而 lock 里记录的是旧平台适配结果 → Composer 会重写 platform 行 - lock 文件用旧版 Composer 生成(如 1.x),当前是 2.x,且启用了
lock升级策略 → 首次 install 会静默升级 lock 格式
这类修改属于“必要同步”,不是 bug,但会影响 CI/CD 的可重现性。解决办法是:团队统一 Composer 版本,并在 composer.json 里加 "lock": false(Composer 2.2+ 支持)来禁用格式升级(注意:仅控制 lock 文件结构,不阻止内容校准)。
composer create-project 或全局 install 场景下的陷阱
这两个场景最容易误触 update 行为:
-
composer create-project vendor/name默认等价于composer create-project --no-install+composer install,但如果目标项目没有composer.lock,就会 fallback 到 update - 全局安装(
composer global require)本质是操作~/.composer/composer.json,而该目录下往往没有 lock 文件 → 每次都相当于 update
应对方式很直接:create-project 后立刻 cd 进去,确认 composer.lock 存在再跑 install;全局依赖尽量用 composer global install(需先有 lock)或改用 phive 等更确定的分发工具。










