“vendor已锁定”是composer install成功还原环境的正常提示,表明vendor目录严格按composer.lock还原;需干预仅当文件损坏或lock过时,此时应分别用--force-reinstall或update --lock-only处理。

vendor已锁定不是错误,是Composer的正常状态
“vendor已锁定”不是报错,而是composer install成功执行后的标准提示——它说明当前vendor/目录已严格按composer.lock还原,版本、哈希、依赖树全部一致。很多人误以为这是“卡住”或“需要强制”,其实只要composer.lock是你期望的版本,这个状态就是安全且可复现的。
真正需要干预的场景只有两类:
• vendor/里文件损坏(如部分PHP类缺失、autoload映射失效)
• composer.lock已过时,但composer install无法更新它(比如你改了composer.json却没同步lock)
别一看到“locked”就急着加各种flag——先确认问题根源,再选对应命令。
想重装vendor但不改lock?用--force-reinstall,不是--force
composer install --force-reinstall是唯一合法、高效、可复现的强制覆盖方案。它不删vendor/,不碰composer.lock,只对每个包执行“删目录 → 下载/解压 → 运行post-install-cmd → 重建autoload”全流程。
-
--force不存在,输错会报Unrecognized option "--force" -
--force-reinstall从Composer 2.2起稳定支持,旧版本需先升级 - 若仍加载旧类或时间戳未更新,大概率缓存损坏,必须加
--no-cache - Windows下常因文件被占用失败,关掉Swoole/Laravel Octane/PhpStorm再试
示例:composer install --force-reinstall --no-cache —— 这才是最接近“强制刷新”的组合,缺一不可。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
想更新lock文件本身?别用install,用update --lock-only
composer install永远只读composer.lock,绝不会修改它。哪怕你改了composer.json里的描述字段或空格,install也会直接报错退出,而不是自动同步lock。
正确做法是:composer update --lock-only。它只重算lock文件的哈希与格式,不下载、不替换vendor、不触发网络请求。
- 必须Composer 2.2+,旧版本不支持该参数
- 加
--dry-run可预览改动:composer update --dry-run --lock-only - 不要手动编辑
composer.lock,破坏哈希一致性会导致CI失败 - 如果
composer.json里require字段变了,--lock-only也会重新解析依赖树并写入新版本
vendor里手动改过文件?--discard-changes不是保留覆盖,是丢弃重来
只要vendor/下任一包存在未提交的Git修改(哪怕只是改了README.md),composer install就会中断,并提示Changes will be discarded. Use --discard-changes to overwrite.
注意:--discard-changes不是“保留你的修改再合并新版本”,而是彻底丢弃所有本地改动,完全按composer.lock重装。
-
composer install --discard-changes:安全常用,lock不变,vendor重置 -
composer update --discard-changes:先求解新依赖树再丢弃,会改lock,风险更高 - 真要保留修改,得走
patches、fork、或PSR-4覆盖等可版本化方案 -
composer dump-autoload或clear-cache对此无效,它们不触碰vendor文件
最易被忽略的一点:Composer检测的是Git工作区状态,不是文件内容差异。哪怕你用IDE改了一行代码,只要没git add,它就认为整个包“脏”了,拒绝继续。










