根本原因是Composer默认强制联网校验元数据,必须设COMPOSER_DISABLE_NETWORK=1并禁用repo.packagist,否则install必卡在Loading repositories;--no-plugins等参数均依赖该环境变量生效。

断网安装失败,根本原因不是网络不通,而是 Composer 默认仍会主动请求 https://repo.packagist.org/packages.json ——这个行为无法跳过,除非你提前切断所有触发点。它不看网卡是否拔掉,只认环境变量和配置。
COMPOSER_DISABLE_NETWORK=1 是硬开关,不是可选项
没设这个变量,composer install 会在 Loading composer repositories 阶段直接报错或卡住,哪怕 vendor 目录完整、composer.lock 也没改过。所有 --no-plugins、--no-scripts 等参数都依赖它生效,不设就白搭。
- Linux/macOS:必须前置写
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader - Windows CMD:
set COMPOSER_DISABLE_NETWORK=1 && composer install --no-plugins --no-scripts --no-autoloader - PowerShell:
$env:COMPOSER_DISABLE_NETWORK="1"; composer install --no-plugins --no-scripts --no-autoloader - 在 Dockerfile 中要写
ENV COMPOSER_DISABLE_NETWORK=1,不能只靠docker run -e,某些 Alpine 镜像不继承环境变量
全局 repo.packagist 必须禁用,否则 fallback 到镜像或官方源
即使设了环境变量,如果之前配过阿里云镜像或自定义源,Composer 仍会尝试 fallback 校验——这不是“建议关闭”,是必须清除。
- 运行
composer config --global repo.packagist false彻底禁用默认源 - 检查是否残留:
composer config --global repo.packagist输出应为空,不能是composer https://packagist.org或内网地址 - 项目级
composer.json里若写了{"type": "packagist", "url": false},在COMPOSER_DISABLE_NETWORK=1下会直接退出,不是静默忽略
离线添加新包只能用 path 仓库,require 不行
composer require 默认必须联网查包名、版本、依赖树,离线时会卡死或报错。唯一可行路径是把本地目录当仓库用,靠 type: path 跳过所有元数据请求。
- 目标包根目录下必须有合法
composer.json,含完整name(如"acme/utils")和version或分支标识(如"dev-main") - 项目
composer.json的repositories段加:{"type":"path","url":"./packages/my-utils"} - 执行
composer require acme/utils:@dev,注意必须带@dev,否则不识别 - 装完立刻运行
composer dump-autoload -o,否则autoload.php不包含该包,运行时报Class not found
最容易被忽略的是 PHP 版本和扩展一致性:源机和目标机的 PHP 小版本(如 8.3.12 vs 8.3.13)、mbstring、openssl、zlib 必须完全一致,否则 vendor/autoload.php 加载就会失败——这和网络无关,但常被误判为离线配置问题。











