composer install 离线失败主因是默认联网校验平台兼容性、插件及脚本依赖,即使 vendor/ 和 composer.lock 齐全;修复关键为运行 composer dump-autoload(或 -o)重生成匹配当前路径的自动加载器,并核对 autoload 配置、真实文件路径与映射一致性。

composer install 为什么在离线时会失败
因为 composer install 默认要访问 packagist.org 拉取包元数据,即使 vendor/ 已存在、composer.lock 也完整,它仍会尝试联网校验平台兼容性、插件钩子、甚至某些脚本的远程依赖。真正卡住的往往不是“没包”,而是 PackageManifest 生成前的平台检查环节。
- 离线时
composer install --no-scripts --no-plugins可跳过部分校验,但自动加载器仍可能指向旧路径或缺失文件 -
vendor/autoload.php本身不依赖网络,但它的内容由vendor/composer/autoload_*.php动态生成,这些文件必须与当前目录结构严格匹配 - 如果你只是把整个
vendor/复制过来,而项目根路径变了(比如从/a/project移到/b/app),autoload_static.php里硬编码的绝对路径就会失效
用 composer dump-autoload 强制重生成自动加载器
这是离线修复最直接有效的操作:它不联网、不改包、只重写 vendor/composer/ 下的 autoload 文件,确保类映射与当前 composer.json 和实际文件结构一致。
- 运行
composer dump-autoload --optimize(简写composer du -o)可生成优化后的静态映射,比默认的 PSR-4 动态查找更快,且不依赖vendor/autoload.php的初始化逻辑 - 如果项目用了自定义
autoload-files或classmap,务必确认对应文件仍在原位置,否则dump-autoload会静默跳过它们 - 注意:若
composer.json中的autoload配置有误(比如路径拼错、缺少psr-4命名空间前缀),dump-autoload会照常执行但生成无效映射——错误只在new ClassX()时暴露为Class not found
检查 vendor/composer/autoload_static.php 里的路径是否真实存在
这个文件是 --optimize 模式下类加载的核心,里面每个 classMap 条目都是绝对路径。离线迁移后最容易出问题的就是它。
- 打开
vendor/composer/autoload_static.php,找到类似'SomeClass' => __DIR__ . '/..' . '/src/Class.php'的行 - 手动拼接一下右边路径(比如
__DIR__是vendor/composer,那完整路径就是vendor/src/Class.php),看文件是否存在 - 常见坑:
composer.json里写了"src/": ["src/"],但实际目录叫SRC/(大小写敏感);或用了符号链接,而目标机器没同步链接本身 - windows 和 linux 路径分隔符差异不影响,因为
__DIR__和.在 PHP 里都适配,但路径拼接结果必须指向真实文件
vendor/autoload.php 被 require 但类仍找不到?优先查 psr-4 映射前缀
很多离线场景下,vendor/autoload.php 能成功加载,但 new AppControllerHome 报错,问题几乎总出在命名空间前缀和目录映射没对上。
- 检查
composer.json的autoload.psr-4是否包含"App": "app/"这类配置,再确认项目里真有app/Controller/Home.php,且文件内声明了Namespace AppController; - 注意:PSR-4 映射是“前缀 → 目录”的关系,不是“目录 → 前缀”。
"App": "src/"表示所有AppXY类应位于src/X/Y.php,而不是反过来推导 - 如果用了多级前缀(如
"Apphttp": "app/Http/"),别漏掉中间的Http/目录层级,否则自动加载器根本不会去那个路径找文件
离线修复的本质不是“让 composer 联网”,而是确保三者对齐:composer.json 的 autoload 配置、磁盘上的真实文件路径、以及 vendor/composer/ 下生成的映射代码。最容易被忽略的是路径大小写和 PSR-4 前缀与目录结构的严格对应关系——这在开发机上可能因文件系统宽容而隐藏,一到生产环境就立刻暴露。