Composer install 报错因默认强制联网获取元数据,需设 COMPOSER_DISABLE_NETWORK=1 才真正离线;仅删 vendor 或加 --no-* 参数无效,必须配合 --no-plugins、--no-scripts 等确保零网络请求。

为什么 vendor 都有了,composer install 还报 Could not fetch https://repo.packagist.org/packages.json
因为 Composer 默认根本不管 vendor 是否存在——它在 install 阶段仍会联网请求元数据(比如包是否存在、版本是否合法),这个行为无法跳过,除非你显式切断网络通路。断网 ≠ 离线模式,COMPOSER_DISABLE_NETWORK=1 是硬性前提,不设它,所有 --no-xxx 参数都无效。
常见错误包括:
- 只改了
composer.json里的"secure-http": false,没设环境变量 - 误以为
--no-network是合法参数(Composer 不识别) - Windows PowerShell 中写了
set COMPOSER_DISABLE_NETWORK=1(CMD 语法),但实际该用$env:COMPOSER_DISABLE_NETWORK="1" - 设了但没导出:比如
COMPOSER_DISABLE_NETWORK=1 composer install在子 shell 执行后变量即失效
离线执行 composer install 的最小安全命令组合
前提是:vendor/ 已存在、composer.lock 未改动、PHP 版本和必需扩展(mbstring、openssl、zlib)完全一致。
必须运行:
COMPOSER_DISABLE_NETWORK=1 composer install --no-interaction --no-plugins --no-scripts --no-dev --optimize-autoloader
关键点说明:
-
--no-plugins:跳过插件初始化,避免phpstan/extension-installer等隐式联网 -
--no-scripts:屏蔽post-install-cmd,防止脚本调用外部 API 或触发 npm 构建 -
--optimize-autoloader:强制重建vendor/autoload.php,否则旧路径残留会导致Class not found - 绝不能加
--ignore-platform-reqs:它会掩盖扩展缺失问题,让错误延后到运行时才暴露
离线安装本地包(比如 ./packages/my-utils)为什么 require 总失败
因为 composer require 默认必须联网查包名和依赖树,离线时直接卡住或报错。唯一可行路径是把本地目录当仓库用,靠 path 类型跳过所有元数据请求。
操作要点:
- 目标包根目录下必须有合法
composer.json,含完整name(如"acme/utils")和明确version或分支标识(如"dev-main") - 项目
composer.json的repositories段要显式声明:{"type":"path","url":"./packages/my-utils"} - 执行
COMPOSER_DISABLE_NETWORK=1 composer require acme/utils:@dev,注意必须带@dev - 同步禁用全局 Packagist:
composer config --global repo.packagist false,否则 fallback 校验仍会触发 - 安装后必须立刻运行
composer dump-autoload -o,否则 PSR-4 自动加载规则不会生效
预下载依赖打包传到离线机,最稳的两步法
这是对环境差异容忍度最高的方式,适合 PHP 版本/扩展不完全一致、或含 bin/ 脚本的项目。
联网机操作:
composer install --no-dev --prefer-dist
然后打包整个缓存 ZIP 目录:
- Linux/macOS:
tar -czf deps.tgz ~/.composer/cache/files/ - Windows:
tar -czf deps.tgz C:\Users\%USERNAME%\AppData\Roaming\Composer\Cache\files\
离线机操作:
- 先清空缓存:
composer clear-cache - 解压到相同路径(路径必须绝对且含
/files后缀) - 运行
COMPOSER_DISABLE_NETWORK=1 composer install --no-interaction,Composer 就会从本地缓存读取
注意:~/.composer/cache/files/ 下的文件名含哈希,不可手动改名;该方式对 Git 源包无效,必须搭配 --prefer-dist 强制走 zip。











