必须设COMPOSER_DISABLE_NETWORK=1,否则composer install必请求https://repo.packagist.org/packages.json而失败;即使vendor存在、lock完整,该硬开关未启用时所有--no-xxx参数均无效,且path仓库或source类型包将导致离线安装必然失败。

断网校园网中 Composer 安装无法靠“拔网线”自动生效,必须显式设 COMPOSER_DISABLE_NETWORK=1 并配合仓库隔离、autoload 补全等操作,否则所有命令(install、require、update)都会卡在 Could not fetch https://repo.packagist.org/packages.json。
为什么 vendor 目录存在还报错?
错误不是因为文件缺失,而是 Composer 在 install 阶段仍会主动请求远程元数据(包是否存在、版本是否合法),这个行为默认开启且无法跳过——除非你切断网络通路并绕过高风险环节。
-
COMPOSER_DISABLE_NETWORK=1是硬开关,不设它,--no-plugins等参数全部无效 - 即使项目
composer.json里写了"repositories": [{"type": "packagist", "url": false}],未设该环境变量时也会直接退出,而非静默忽略 - 校园网 DNS 污染常见,但“断网”不等于“离线模式”,Composer 不会检测网络连通性,只按配置执行
离线安装必须用的命令组合
前提是已有完整 vendor/ 和未改动的 composer.lock(PHP 版本、扩展如 mbstring/openssl 必须一致):
- 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 - 执行完必须立刻补一记:
composer dump-autoload -o,否则运行时大概率报Class not found
想离线加新包?别用 require,改用 path 仓库
composer require 默认必须联网查包名、版本、依赖树,离线必失败。唯一可行路径是把本地目录当仓库用,靠 path 类型跳过所有元数据请求:
- 目标包根目录下必须有合法
composer.json,含完整name(如"acme/utils")和明确version或分支标识(如"dev-main") - 项目
composer.json的repositories段显式声明:{"type":"path","url":"./packages/my-utils"} - 执行:
composer require acme/utils:@dev(注意必须带@dev,否则不识别) - 必须同步禁用 Packagist:
composer config --global repo.packagist false,否则仍 fallback
最容易被忽略的三个点
很多人配完环境变量就以为万事大吉,结果在校园网隔离机上仍失败,问题往往出在这三处:
-
composer.lock中若存在"source"类型条目(如"url": "git@github.com:xxx/yyy.git"或"dev-master"),离线时无法校验,install必然失败 - 没清掉全局配置里的
repo.packagist,仅靠--no-plugins拦不住元数据校验;验证方式:composer config --global --list | grep repo.packagist,输出应为repo.packagist false - 路径权限或符号链接失效:若用了
path仓库,务必在composer.json中加"options": {"symlink": false},否则离线机软链不可用


















