必须设 COMPOSER_DISABLE_NETWORK=1,否则 composer install 必然因强制联网校验远程元数据而卡在 packages.json 请求;该变量是离线执行前提,所有 --no-* 参数均依赖它生效,且需同步清理 packagist 配置与确保 PHP 扩展一致。

必须设 COMPOSER_DISABLE_NETWORK=1,否则 composer install 一定会卡在 Could not fetch https://repo.packagist.org/packages.json —— 这不是网络抖动,是 Composer 默认行为强制校验远程元数据。
为什么 vendor 存在、lock 文件完整,composer install 还报错
错误根源不在文件缺失,而在 Composer 的依赖解析流程默认会发起 HTTP 请求:查包是否存在、验证版本合法性、检查 dist URL 是否可访问。这些动作发生在 install 阶段早期,哪怕 vendor/ 已解压好,只要没切断网络通路,它就一定会尝试联网。
-
COMPOSER_DISABLE_NETWORK=1是硬性开关,它让整个解析流程跳过所有 HTTP 请求(包括仓库元数据加载、包信息查询、dist URL 检查) - 所有
--no-xxx参数(如--no-plugins、--no-scripts)都依赖这个环境变量生效;不设它,这些参数全无效 - 如果项目
composer.json里写了"repositories": [{"type": "packagist", "url": false}],即使设了COMPOSER_DISABLE_NETWORK=1,也会直接退出,不是静默忽略
composer install 离线执行的最小安全命令组合
前提是:vendor/ 已存在、composer.lock 未改动、PHP 版本和必需扩展(mbstring、openssl、zlib、zip)完全一致。
-
--no-plugins:跳过插件初始化,避免phpstan/extension-installer等隐式联网 -
--no-scripts:屏蔽post-install-cmd,防止脚本调用外部 API 或生成前端资源 -
--no-autoloader:绕过 autoload 重建,某些自定义实现会触发远程类查找 - 执行完必须立刻补一记:
composer dump-autoload -o,否则运行时大概率报Class not found
离线前必须清理的配置残留
即使你只打算用本地 vendor/ 目录,全局或项目级残留的 Packagist 配置仍会触发 fallback 校验,导致失败。
- 运行
composer config --global repo.packagist false,彻底禁用全局默认源 - 检查项目级配置:
composer config repo.packagist输出应为空;若显示composer https://packagist.org,说明没清干净 - 手动打开
composer.json,删掉"repositories"数组中任何指向https://packagist.org的条目 - 用
composer install -v观察真实请求地址;如果仍有Downloading https://repo.packagist.org/packages.json,说明某处配置没生效
最容易被忽略的是 PHP 扩展一致性:比如 ext-zip 缺失会导致 dist 包无法解压,错误不会表现为网络相关提示,而是 Class not found 或 autoload 失败。离线机上没有调试机会,所有环境对齐必须在迁移前完成。











