离线环境无法使用composer create-project,因其强制联网解析模板元数据,必须改用分步法:联网机构建骨架+vendor+lock→迁移→离线机执行COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader→补dump-autoload -o。

离线环境用 composer create-project 必然失败,不是配置问题,是命令本身不支持离线。 它第一件事就是联网解析模板元数据,哪怕你把 composer.lock 和 vendor/ 全拷过去也没用。
为什么 create-project 在离线机上一定挂
这个命令本质是两步:先 git clone 或下载模板仓库(如 yiisoft/yii2-app-basic),再进目录执行 composer install。但第一步就会访问 https://repo.packagist.org/packages.json 去查模板包的最新版本和依赖树。
- 报错典型形式:
Could not fetch https://repo.packagist.org/packages.json或Package yiisoft/yii2-app-basic not found -
COMPOSER_DISABLE_NETWORK=1对它完全无效——它不读这个环境变量 -
--offline参数根本不存在,Composer v2 没这选项 - 即使项目里已有
composer.lock,它也不会跳过远程解析,而是坚持校验来源是否匹配
离线初始化项目的唯一可行路径
必须绕过 create-project,改用分步法:手动准备骨架 + 复制完整 vendor/ + 补全 autoload。
- 在联网机上用
git clone或解压官方 ZIP 获取骨架(如yiisoft/yii2-app-basic),删掉其中的composer.lock(防止锁住远程地址) - 进目录后运行:
composer install --no-dev --prefer-dist --no-scripts --no-plugins --optimize-autoloader,确保所有子依赖都进vendor/,且不触发任何脚本 - 打包整个目录(含
vendor/、composer.lock、composer.json),拷入离线机 - 离线机上先清全局缓存:
composer config --global cache-dir /dev/null,再执行:COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader - 最后必须补一记:
composer dump-autoload -o,否则大概率报Class not found
容易被忽略的关键细节
离线部署最常栽在两个地方:一是 PHP 版本不一致导致 vendor/ 里有语法错误(比如源机 PHP 8.2 编译的 opcache 文件,在目标机 PHP 7.4 上直接退出);二是 composer.json 里残留了 repositories 字段,它会覆盖全局镜像或本地 path 配置,让 Composer 在离线时还试图去连不存在的源。
验证方式很简单:离线机上运行 composer config --list,确认输出里没有 repositories 相关项;再看 composer install -vvv 的日志,如果出现 Reading .../packages.json 这类远程路径,说明某处 still leaking network.











