composer install 从不生成 composer.lock,必须用 composer update 解析 composer.json 并生成;误删后重跑 install 无效,新版报 Command "install" is not defined,旧版静默失败致 vendor 错误。

composer install 为什么死活不生成 composer.lock?
它根本不会生成——composer install 只认锁文件,没有就直接报错 No composer.lock file present,不是提示你“该生成了”,而是明确拒绝执行。常见错误是删了 lock 文件后反复跑 composer install,结果只是循环报错。新版 Composer(v2.5+)甚至会报 Command "install" is not defined,旧版则可能静默失败,导致 vendor/ 里装了一堆不匹配的包。
正确做法只有一条:composer update。它会解析 composer.json、计算依赖树、校验哈希、写入精确版本,最终生成有效的 composer.lock。首次初始化项目、CI 流水线拉代码、新成员克隆仓库,都必须走这一步。
改了 composer.json 后,为什么 composer install 还是装旧版本?
因为 composer install 完全忽略 composer.json 里的新约束,只按 composer.lock 装。你改了 "guzzlehttp/guzzle": "^8.0",但 lock 文件里还记着 "7.5.0",那 install 就永远装 7.5.0。
要让修改生效,必须显式更新 lock 文件:
-
composer update guzzlehttp/guzzle:只重算这个包及其子依赖,其余不动 -
composer update --lock:不装不卸,仅用当前vendor/和composer.json重建 lock,适合修复本地改包但没同步 lock 的情况 -
composer require guzzlehttp/guzzle:^8.0:比手动改 JSON 更安全,自动触发一次受控的 update
漏掉这步,就等于在本地偷偷换了依赖逻辑,却没通知团队和 CI。
Git 合并冲突时,能手动修 composer.lock 吗?
不能。任意删行、调换字段顺序、缩进不一致、甚至多一个空格,都会破坏 content-hash 校验,后续 composer install 直接失败,报 Your lock file does not contain a compatible set of packages。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
安全解法只有三步:
- 先用
git checkout --ours composer.lock或git checkout --theirs composer.lock拿回任一干净版本(推荐选目标分支,如main) - 删掉
vendor/,清空干扰 - 跑
composer install—— 如果报错,说明两边composer.json真有冲突,必须人工对齐后再composer update
别信“我只改了两行,应该没问题”——lock 文件不是配置文件,它是依赖快照的二进制等价物,结构敏感度极高。
Composer 2.x 的 lock 文件为什么在旧环境跑不起来?
因为 Composer 2.x 生成的 composer.lock 包含 "plugin-api-version": "2.2.0" 字段,而 1.x 解析时直接 fatal error:Invalid lock file. Expected key "plugin-api-version"。这不是兼容性警告,是解析器层面的硬性拒绝。
升级到 Composer 2.x 后,必须:
- 删掉旧
composer.lock - 统一所有开发机和 CI 的 Composer 版本(例如 GitHub Actions 中用
setup-php显式指定composer-version: '2.9.6') - 确认项目中自定义插件的
composer-plugin-api兼容版本 ≥ 2.2.0
混用 1.x 和 2.x,等于把锁文件当草稿纸用——看着都叫 composer.lock,实际互不认。

















