composer install 不能增量同步,因其语义是“按 lock 精确还原”,非“补差”:vendor 存在时仅校验 hash,不删/不覆/不报错,残留旧包(如 monolog 2.7.0)将导致类加载失败或 fatal error。

composer install 为什么不能跳过 vendor 清理直接“增量同步”
它根本不是设计来做差异同步的。composer install 的语义是「按 composer.lock 精确还原」,不是「把当前 vendor 补到和 lock 一样」。只要 vendor/ 目录存在,它就只检查已安装包的 hash 是否匹配 lock,不删、不移、不覆盖冲突文件。
常见错误现象:monolog/monolog 在 lock 里是 2.8.2,但你本地 vendor 里还残留着 2.7.0 的文件;install 不报错也不替换,运行时可能加载旧类、方法缺失、甚至 fatal error。
- 不要依赖
composer dump-autoload救场——autoload 文件只是映射,包本体可能早已错位 -
composer clear-cache无效,缓存影响的是下载环节,不是 vendor 目录状态 - CI 脚本里写
composer install --no-dev前没rm -rf vendor,等于每次都在脏环境中叠加变更
怎么安全地做“只更新变动部分”的 vendor 同步
没有真正的“只更新变动部分”。所谓“差异”,在 Composer 体系里只能靠 lock 文件 diff 来识别,而实际执行仍必须全量重建。但你可以控制范围:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 用
composer update vendor/package-name—— 它会重解析该包及其子依赖,lock 中其余包版本锁定不变 - 加
--with-all-dependencies才会让传递依赖也跟着升(否则可能卡在旧版本导致约束冲突) - 务必先
composer update --dry-run vendor/package-name,看清楚会动哪些版本,尤其注意主版本号跳变(如guzzlehttp/guzzle:7.5.0 → 8.0.0) - 更新后立刻
git add composer.json composer.lock,别只提 lock —— 否则别人install时会因 json/lock 不匹配失败
多人协作中 vendor 同步失败的典型报错和定位点
看到报错别急着重装,先盯住这几行输出:
-
The lock file does not contain the required package "xxx":说明composer.json里新加了依赖,但没跑composer update xxx更新 lock,或有人漏提交 lock -
Your requirements could not be resolved出现在composer install阶段:大概率是本地vendor/残留 + lock 文件被改过,或 PHP 版本不满足 lock 顶部"platform"字段声明(比如 lock 写着"php": ">=8.2.0",而你本地是 8.1.9) -
Class not found且路径指向vendor/autoload.php:基本可判定是复制过 vendor 目录,或挂载了宿主机 vendor ——autoload.php里硬编码的__DIR__已失效
生产环境同步 vendor 必须做的三件事顺序不能乱
线上部署不是开发机重装,任何省略都会埋雷:
- 第一步:
rm -rf vendor/—— 不接受任何“保留部分目录”的妥协,符号链接、平台二进制、autoload 映射全绑定路径 - 第二步:
git diff composer.lock或比对sha256sum composer.lock,确认和你本地测试通过的版本完全一致(包括 dist URL 是否指向私有源、hash 是否未被手改) - 第三步:
composer install --no-dev --optimize-autoloader --no-interaction——--optimize-autoloader生成静态 classmap,避免运行时遍历;--no-interaction防止卡在信任提示上
最常被忽略的是第二步:lock 文件看着一样,但里面记录的私有包 dist URL 在线上机器无法访问,install 就会卡在 download 失败,而不是立刻报错。

















