因为composer install只依据composer.lock还原依赖,不读composer.json;若lock文件未记录该包(如未运行composer update、手动编辑损坏、Git未提交新lock等),install便会跳过。

composer.lock 缺少包,不是 vendor 没装全,而是 lock 文件本身没记录这个包——它根本不在还原清单里,composer install 自然跳过。
为什么 composer install 不装某个包,即使 composer.json 里写了?
因为 composer install 只认 composer.lock,不读 composer.json 的版本范围。常见原因有:
-
composer.json刚加了新包,但没运行composer update vendor/package-name或composer update,导致composer.lock没更新 - Git 合并冲突时手动删了 lock 文件里某段 JSON,或编辑时格式损坏(比如漏逗号、引号不闭合)
- 有人执行了
composer remove vendor/package-name但没提交新的composer.lock,其他人拉代码后 install 就“看不见”这个包 -
composer.json中包名末尾有空格、用了中文引号、或写成了"vendor/package": "dev-main "(注意末尾空格),composer validate不报错,但 lock 文件不会收录
快速确认是不是 lock 文件真缺包
别猜,用命令直接验证:
- 运行
composer show vendor/package-name:如果返回no such package,说明它压根没进依赖树,不是 vendor 缺文件 - 运行
composer validate:检查 lock 文件 JSON 是否合法,以及是否报告Required package "vendor/package-name" is not present in the lockfile - 打开
composer.lock,搜索"name": "vendor/package-name"—— 注意要搜完整字段,不是只搜包名字符串
缺失包的正确补齐流程(不重装全部依赖)
目标是让 lock 文件重新收录该包,且不波及其他已锁定版本:
- 先确保
composer.json中该包写法干净:"vendor/package-name": "^1.2",无多余空格、无中文标点 - 运行
composer require vendor/package-name --no-update:只改composer.json,不碰 lock - 再运行
composer update vendor/package-name --with-all-dependencies:仅更新这个包及其直系依赖,lock 文件会精准补入,其他包版本不变 - 最后
git add composer.json composer.lock && git commit -m "add vendor/package-name",避免下次又丢
补完还报 Class not found?重点查 autoload 和平台约束
包进了 lock、vendor 也装了,但运行时报类找不到,往往卡在这两个地方:
-
composer dump-autoload没执行:某些包(尤其是含自定义 autoload 规则的)需要手动刷新映射,不能只靠 install -
composer.lock里"platform"配置锁死了 PHP 版本(如"php": "8.2.10"),而你本地是 8.1 —— 此时即使包装进 vendor,autoload 也可能因版本校验失败被跳过 - 该包本身 require 了某个扩展(如
ext-gd),但composer check-platform-reqs显示缺失,autoload 生成阶段会静默跳过部分文件
真正容易被忽略的是:lock 文件里包的 source 字段(如 "type": "git")如果指向私有仓库,而当前环境没配 auth.json,composer install 会假装成功,但实际 vendor 下只有空目录——这种“缺失”不会报错,只能靠 ls vendor/package-name 或 composer show 确认是否真解压了文件。











