必须设COMPOSER_DISABLE_NETWORK=1,否则composer install必报Could not fetch packages.json;还需加--no-plugins --no-scripts --no-autoloader并执行dump-autoload -o,且vendor、lock文件须完整且无source类型包。

断网期间不能“安装 Composer”,只能配置已存在的 Composer 二进制为离线模式运行;核心是设 COMPOSER_DISABLE_NETWORK=1,否则所有命令(包括 composer install)都会卡在请求 https://repo.packagist.org/packages.json 上。
为什么 composer install 一执行就报错或卡住?
错误不是因为没联网,而是 Composer 默认行为强制校验远程元数据——哪怕 vendor/ 已存在、composer.lock 也完整,它仍会尝试访问 Packagist。这个请求无法跳过,除非显式切断网络通路。
-
Could not fetch https://repo.packagist.org/packages.json是最常见错误,本质是环境变量COMPOSER_DISABLE_NETWORK=1没设 -
--no-network参数根本不存在,Composer 不识别,别写 - 只改
composer.json里的"secure-http": false或删repositories块,完全无效 - Windows PowerShell 中漏写
$env:COMPOSER_DISABLE_NETWORK="1",而用了 CMD 的set语法,变量不生效
离线 install 必须带的参数组合
仅设环境变量还不够。默认行为仍会触发插件、脚本、autoload 重建等环节,其中某些插件(如 phpstan/extension-installer)或脚本(如 post-install-cmd)可能隐式联网。
-
--no-plugins:跳过插件初始化,防止插件查版本或连 CDN -
--no-scripts:屏蔽所有post-install-cmd,避免调用npm install或生成前端资源 -
--no-autoloader:绕过 autoload 重建阶段,某些自定义 autoloader 实现会尝试远程类查找 - 执行完必须立刻补一记:
composer dump-autoload -o,否则运行时大概率报Class not found
vendor 目录能直接复制吗?
可以,但有硬性前提,缺一不可:
- 源机与目标机的 PHP 版本必须完全一致(例如都是
8.3.12;8.3.12vs8.3.13可能因内部 API 微变导致类加载失败) - 目标机必须已启用
mbstring、openssl、zlib扩展,否则vendor/autoload.php加载即失败 -
composer.lock必须一并拷贝且未被修改;若含"source": {"type": "git"}条目(如"url": "git@github.com:xxx/yyy.git"),离线 install 必然失败 - 验证方式:
php -r "require 'vendor/autoload.php';"不报错才算通过
离线添加新包只能靠 path 仓库
composer require 默认必须联网查包名、版本、依赖树,离线时直接报错或卡住。唯一可行路径是把本地目录当仓库用,靠 path 类型跳过所有元数据请求。
- 目标包根目录下必须有合法
composer.json,含完整name(如"acme/utils")和明确version(如"1.2.0")或分支标识(如"dev-main") - 项目
composer.json的repositories段要显式声明:{"type":"path","url":"./packages/my-utils"} - 执行
composer require acme/utils:@dev,注意必须带@dev,否则不识别 - 装完必须立即运行
composer dump-autoload -o,否则运行时报Class not found
最容易被忽略的是全局镜像残留和锁文件结构:即使你设了 COMPOSER_DISABLE_NETWORK=1,只要 composer config --global repo.packagist 还返回一个 URL,或者 composer.lock 里混着 "source": {"type": "git"},install 就会失败——这不是配置没生效,是根本没满足离线前提。











