离线执行 composer require 必然失败,正确做法是在联网机器用 composer install 生成 vendor/ 和 composer.lock,再整体打包至离线机,运行 composer install –no-dev –ignore-platform-reqs;需确保 lock 文件存在、vendor 干净、php 环境兼容,私有包必须提前纳入 vendor 快照。

离线环境执行 composer require 会直接失败
因为默认行为是去 Packagist 拉取元数据和 ZIP 包,没网络就卡在 Could not fetch packages 或 Connection refused。离线时不能指望 Composer 自己“猜”出依赖树或下载路径。
必须提前在有网机器上导出完整依赖快照
核心思路不是“离线安装”,而是“把在线环境的安装结果完整搬过去”。关键命令是 composer install --no-dev --prefer-dist --dry-run 配合 composer archive 或手动打包。
- 先在联网机器用目标
composer.json运行composer install,生成完整的vendor/和锁文件composer.lock - 用
composer archive打包指定包(如composer archive monolog/monolog 2.9.1),但注意它只打单个包,不处理依赖链 - 更稳妥的做法:直接压缩整个
vendor/目录 +composer.lock,到离线机解压后运行composer install --no-dev --ignore-platform-reqs - 如果离线机 PHP 版本或扩展不同,
--ignore-platform-reqs能绕过检查,但得自己确认兼容性
composer install 离线运行前必须检查三件事
少一个都会中断:锁文件存在、vendor 目录干净、PHP 环境匹配。
-
composer.lock必须存在且和composer.json一致——删掉 lock 文件再离线运行install会报No composer.lock file present - 离线机的
vendor/要么不存在,要么完全删除;残留旧包会导致 autoload 冲突或类找不到 - 扩展依赖(如
ext-gd)若缺失,composer install可能不报错,但运行时才崩——建议离线前在联网机用composer check-platform-reqs记下要求
私有包或 VCS 包在离线时根本不可用
像 "my/private-package": "dev-main" 这种指向 git 仓库的配置,在离线环境下 composer install 会卡死在 Cloning into...。没有折中方案,必须提前把这类包也打进 vendor 快照里。
- VCS 包无法用
composer archive处理,只能靠完整 vendor 打包 - 私有 Packagist 镜像(如 Satis)同样需要离线机网络可达——如果镜像服务本身也离线,那就彻底不可用
- 替代办法:把私有包源码按 PSR-4 结构放进项目
src/,改autoload,绕过 Composer 包管理
离线加包这件事,本质是“把构建过程前置”,不是“让 Composer 学会断网工作”。最容易被忽略的是锁文件和 vendor 的耦合关系——很多人以为只要拷贝 vendor 就行,结果忘了 lock 文件版本不匹配,导致 autoload.php 生成错误或依赖解析失败。