composer install 离线失败是因为默认联网校验 composer.lock 中的哈希与版本约束,需用 –no-network 参数禁用网络请求,并确保 lock 文件含完整 dist.shasum、vendor 目录存在且 php 环境兼容。

composer install 为什么离线会失败
因为默认行为会访问 packagist.org 拉取包元数据,即使本地有 vendor/,composer install 仍尝试联网校验 lock 文件里的哈希和版本约束。没网就卡在 Reading composer.json of vendor/package (dev-main) 或直接报 Could not fetch https://repo.packagist.org/packages.json。
- 必须提前在有网环境跑过完整
composer install或composer update,生成完整的vendor/和有效的composer.lock -
composer.lock里得包含每个包的dist.shasum和source.reference,否则离线时无法跳过校验 - 别用
--no-install或只保留composer.json就断网——那等于没准备
离线运行 install 的正确命令组合
核心是告诉 Composer:别联网、别查 repo、只信本地文件。靠两个关键参数压制网络行为:
- 加
--no-network:禁止所有 HTTP 请求,包括 repo 元数据、包 zip 下载、github API 调用 - 加
--ignore-platform-reqs(可选):如果离线机器 PHP 版本/扩展和开发机不一致,避免因平台约束失败 - 不要加
--update-with-dependencies或任何带update的选项——那会强行联网刷新依赖树
最终命令就是:composer install --no-network。它会跳过所有远程请求,直接读 composer.lock,校验 vendor/ 里每个包的 dist.shasum,然后生成 vendor/autoload.php 和类映射文件。
autoload.php 生成失败的常见原因
即使加了 --no-network,vendor/autoload.php 仍可能不存在或不生效,问题通常出在:
-
vendor/composer/autoload_*.php文件缺失——说明之前没成功执行过 install,或被手动删了vendor/composer/目录 -
composer.lock里某个包的dist.shasum字段为空或为NULL——这种 lock 文件是半截产物,离线时无法验证,Composer 会拒绝继续 - 用了
path类型仓库且指向本地目录,但该目录在离线机器上不存在或路径不对——Composer 会静默跳过,导致 autoload 里缺类
检查方法:ls -l vendor/composer/autoload_*.php;再看 composer.lock 里任意一个包的 dist 块是否含 "shasum": "xxx"。
PHP 版本和扩展兼容性陷阱
离线环境 PHP 版本比生成 composer.lock 时低,或缺了某些扩展(比如 ext-zip),会导致 autoload 文件生成中途退出,但错误可能藏在日志里不显眼:
-
ext-zip缺失 → 解压包失败,autoload 不生成,报错类似class ZipArchive not found - PHP 版本低于
composer.json里config.platform.php设定值 → 即使加了--ignore-platform-reqs,某些插件(如hirak/prestissimo)仍可能崩溃 - 离线机器开了
opcache.enable=1且opcache.validate_timestamps=0→ 修改了composer.json后运行install,旧的 autoload 可能被缓存住,类找不到
最稳做法:离线前,在目标环境用相同 PHP 版本+扩展跑一次 composer install --no-network,确认 vendor/autoload.php 能 require 且不报错。