删 vendor 后应优先执行 composer install(需存在 composer.lock);若 lock 缺失,则用 composer update 重建,但会改变依赖版本;手动 require 补装易出错且低效;Windows 下注意路径长度与权限问题。

vendor 目录删了,直接 composer install 就行
只要项目根目录下还有 composer.lock 文件,composer install 就会严格按它里面记录的版本、哈希和依赖关系重装全部包,不会去查 composer.json 的 ^ 版本范围,也不会升级任何东西。
常见错误现象:composer install 报错说 “No composer.lock file present” 或 “Dependency resolution failed”,说明 lock 文件也没了——这时候不能硬上 install,得先处理 lock 缺失问题。
- 确认
composer.lock是否存在:运行ls -l composer.lock(Linux/macOS)或dir composer.lock(Windows) - 如果 lock 文件还在,直接执行
composer install,别加--no-dev之类参数,除非你明确知道不需要 dev 依赖 - 如果项目用的是 Composer 2.x,安装速度明显快于 1.x,但行为逻辑一致;无需降级或切换命令
composer.lock 被删了,composer install 会失败,得用 composer update
composer install 的设计就是“只认 lock”,没 lock 就拒绝执行。这时候必须用 composer update,但它会重新解析 composer.json 并生成新 lock,结果可能和原来不一样。
使用场景:你确定能接受依赖版本浮动(比如开发环境临时重建),或者旧 lock 真的找不回来了。
-
composer update默认更新所有包,包括require和require-dev,行为等价于composer update --with-all-dependencies - 如果只想恢复和之前最接近的状态,优先尝试找回旧的
composer.lock:查 Git 历史(git checkout HEAD -- composer.lock)、回收站、备份目录 - 执行
composer update后,新生成的composer.lock里每个包的content-hash都变了,CI/CD 流水线如果校验该字段,会检测到变更
为什么不用 composer require xxx 一个个装
手动补装不仅慢,还极大概率装错版本。Composer 的依赖图是网状的,一个包的版本变动可能触发整棵树的重解析,require 命令无法还原原始 lock 中锁定的精确子依赖版本。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
性能影响:每执行一次 composer require,Composer 都要跑一遍完整的依赖求解,反复多次等于做 N 次重复计算,远慢于单次 install 或 update。
-
composer require monolog/monolog可能装 v2.10.0,但原始 lock 里可能是 v2.9.2,且其子依赖psr/log锁的是 1.1.4 而不是 2.0.0 - 有些包在
require-dev里(如phpunit/phpunit),手动漏掉会导致测试跑不起来,而composer install默认包含它们 - 私有仓库配置(如
repositories)若未全局设置,单个require还可能因源不可达失败
Windows 下权限或路径太长导致 install 卡住或报错
特别是 vendor 目录嵌套深、或防病毒软件实时扫描时,composer install 可能卡在 “Installing dependencies from lock file” 阶段,或抛出类似 mkdir(): Permission denied、Path too long 的错误。
兼容性影响:Composer 2.2+ 对 Windows 长路径支持更好,但仍建议主动规避。
- 临时关闭 Windows Defender 实时防护(设置 → 病毒和威胁防护 → 管理设置 → 实时保护 → 关闭)
- 用 Git Bash 或 Windows Terminal 替代 CMD 运行命令,避免 CMD 的路径处理 bug
- 把项目移到短路径下,例如
C:\proj\myapp,而不是C:\Users\Name\Documents\GitHub\long-company-name\long-project-name\... - 如果仍失败,加
--no-plugins --no-scripts参数跳过插件和脚本执行,先确保 vendor 结构拉下来再说
事情说清了就结束。真正容易被忽略的是:很多人删 vendor 后第一反应是 composer update,却没意识到这已经悄悄改写了 lock 文件——下次别人拉代码,装出来的依赖可能就不是你本地跑通的那个版本了。










