composer install 严格按 composer.lock 还原环境,不更新依赖;当提示“lock file is not up to date”时,说明 composer.json 与 composer.lock 不一致,应根据意图选择 composer update --lock(仅同步元信息)或 composer update(重算并升级依赖)。

composer install 才是同步 lock 文件的正确命令,不是 update;update 会重算依赖、改 lock、升级包,install 才严格按 lock 还原环境。
为什么 composer install 报 “Lock file is not up to date”
这不是错误,而是明确提示:composer.json 和 composer.lock 内容不一致。常见原因包括:手动改了 composer.json(如增删包、调版本、改 platform)、git merge 后只保留了 composer.json 变更却漏掉 composer.lock、或有人提交了 lock 但没同步 json。
此时别直接跑 composer update——它会升级一堆你没动过的包。该怎么做取决于你的意图:
- 想保持当前 vendor 状态,仅让 lock 文件“对齐” json 的元信息(如 content-hash、platform 字段):运行
composer update --lock-only(Composer 2.2+) - 不确定改动影响范围:先
composer update --dry-run --lock-only,输出为Nothing to install or update才说明安全 - 只是加了个
require-dev工具且不想影响线上依赖:composer update --lock-only足够,它不碰已安装包 - 若
--dry-run显示大量包将变更,说明 json 约束已和当前 vendor 不兼容,需评估是否接受升级
刚克隆项目,composer.lock 缺失或损坏怎么办
根本问题不是“怎么生成 lock”,而是“如何安全重建与原环境一致的依赖快照”。composer install 在无 lock 时不会自动补全,而是报错退出(除非加 --no-lock,但风险极高)。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
正确路径分三类:
- 原项目有
composer.lock但你没拉下来:检查.gitignore是否误写了composer.lock,或 git clone 时用了浅克隆;补拉后直接composer install - 原项目没提交 lock(如历史遗留):必须回到原项目根目录,运行
composer update --lock生成它(不是install),再复制过来 - lock 文件存在但内容被破坏(如 JSON 格式错误、shasum 校验失败):运行
composer update --lock-only --dry-run验证能否解析;若失败,只能删掉 lock +vendor/,再composer update重算(接受版本漂移)
CI/CD 或部署机上必须用 composer install
这是唯一能保证构建产物可重现的操作。只要 composer.lock 存在且未被修改,composer install 就完全跳过依赖解析、不联网查包、不校验版本约束,只按 lock 记录的 dist.url 和 dist.shasum 下载安装。
容易踩的坑:
- CI 脚本里写
composer update:每次构建都生成新 lock,哈希不同、版本可能漂移,导致测试通过但线上崩溃 - 部署前删了
vendor/却只跑composer install:它不清理旧文件,残留类可能被 autoload 加载,引发行为错乱 - PHP 版本不匹配
composer.lock中的platform.php字段:Composer 会跳过部分包或报Your requirements could not be resolved,而非静默降级 - 私有包源未配置认证:
composer install仍会按 lock 里的vcs地址尝试 clone,报401 Unauthorized,需提前配好auth.json
同步 lock 时最容易被忽略的细节
很多人以为“文件存在就等于锁住了”,其实真正起作用的是三个隐性条件是否同时满足:lock 文件必须由当前 composer.json 生成(content-hash 匹配)、vendor 目录必须干净(无残留或混装)、运行环境必须满足 lock 中声明的 platform 约束(如 PHP 版本、扩展)。任意一条断裂,composer install 就会退化为重算或报错——而这些条件,往往只在 CI 失败或线上出 bug 时才暴露出来。










