必须删 composer.lock、设 COMPOSER_DISABLE_NETWORK=1、清缓存并删 vendor,再执行 composer install --no-plugins --no-scripts --no-autoloader;否则 Composer 仍会按锁文件中硬编码的旧源地址联网校验哈希。

离线配置失败后,不能只删 vendor 或清缓存——必须同步清除 composer.lock、禁用网络开关、并强制跳过校验逻辑,否则 Composer 仍会尝试联网比对哈希。
composer install --no-cache --force-checksums 为什么还报 hash verification failed
因为 --force-checksums 是让 Composer 强制校验下载包的哈希值,而不是跳过它;离线环境下你没提供新包,它拿本地 composer.lock 里记的老哈希去比对根本不存在的远程元数据,必然失败。
- 真正该做的是:先关网络、再删锁文件、最后重装
- 必须设环境变量
COMPOSER_DISABLE_NETWORK=1,否则所有--no-xxx参数都无效 - 删掉
vendor/和composer.lock后,再运行composer install --no-plugins --no-scripts --no-autoloader - 如果项目有自定义
repositories字段(哪怕只是{"packagist.org": false}),也得先composer config --unset repositories,否则会直接报找不到包
执行 composer self-update 回退版本却卡在 SSL 或 404 怎么办
Composer 的 self-update 默认从 https://getcomposer.org 下载 PHAR,不走任何镜像源,国内直连基本不可用。这不是配置问题,是网络路径被硬编码了。
- 最稳做法:去
https://github.com/composer/composer/releases手动下载目标版本的composer.phar - 确认当前二进制位置:
which composer(Linux/macOS)或where composer(Windows) - 备份原文件:
cp $(which composer) /tmp/composer.bak(Linux/macOS) - 覆盖安装(需写权限):
sudo mv composer.phar $(which composer) && sudo chmod +x $(which composer) - 验证:
composer --version和composer diagnose都要跑一遍
为什么删了全局镜像配置,离线 install 还提示 Could not fetch packages.json
因为 Composer 在离线模式下仍会尝试读取 composer.lock 中记录的源地址(比如 https://mirrors.aliyun.com/composer/),而这个 URL 已被硬编码进 lock 文件,删配置根本不管用。
- 必须删掉
composer.lock,否则它永远按旧地址去找 - 检查是否残留环境变量:
echo $COMPOSER_REPO_PACKAGIST(Linux/macOS)或echo %COMPOSER_REPO_PACKAGIST%(Windows),有输出就得unset或set COMPOSER_REPO_PACKAGIST= - Windows 用户注意:
%APPDATA%\Roaming\Composer\config.json和~/.composer/config.json可能同时存在,得两边都查 - 临时验证是否真离线成功:
composer require monolog/monolog --no-install -vvv 2>&1 | grep "Downloading",不应出现任何 HTTP 请求行
离线场景下最易被忽略的点:lock 文件不是“描述依赖”,而是“锁定元数据来源”。只要它没删,你就永远绕不开那个已失效的镜像地址。


















