composer离线安装需显式启用--offline并确保缓存完整:检查cache-dir下repo和dist目录是否存在对应packages.json及.zip包,配置composer_cache_dir为全英文无空格路径,配合--no-interaction和--prefer-dist使用。

composer install 时提示 Could not fetch packages 怎么办
没网络时,composer install 默认会尝试连 Packagist,哪怕本地有缓存也失败。根本原因不是缓存不存在,而是 Composer 默认不启用离线模式,也不检查本地镜像或已下载的 zip 包。
实操上必须显式告诉它“别联网”,靠两个关键配置:
- 加
--no-interaction和--prefer-dist(确保走压缩包而非 git clone) - 提前设置
COMPOSER_CACHE_DIR指向你确认有内容的缓存目录(比如~/.composer/cache) - 运行前执行
export COMPOSER_NO_INTERACTION=1,避免卡在交互提示
如何验证缓存里真有需要的包
Composer 缓存不是“用了就留”,而是按 vendor/package-name/version 结构存压缩包和元数据。没网络时,光有 vendor/ 目录没用——那是安装结果,不是缓存源。
检查缓存是否可用,直接看这个路径是否存在且非空:
$(composer config cache-dir)/repo/https---packagist.org/
里面应该有 packages.json 和按 vendor 名分的子目录;再进 dist/ 子目录,应能看到 .zip 文件。如果这些是空的或压根没生成过,composer install --offline 一定会报错。
composer install --offline 的真实行为边界
--offline 不是万能开关:它只跳过远程元数据更新和 dist 下载,但依然会读取本地缓存中的 packages.json 和 .zip。一旦缓存缺失某包的 dist 文件,或者 lock 文件里指定了一个你从没装过的版本,它立刻失败,不会退化到其他策略。
- 必须确保
composer.lock是之前联网时生成的,且未被手动修改 - 不能在
--offline下执行composer update—— 它会直接报错退出 - PHP 扩展依赖(如
ext-curl)检查仍会运行,跟网络无关,但缺扩展照样中断
Windows 下 COMPOSER_CACHE_DIR 容易错在哪
Windows 用户常把缓存路径设成带空格或中文的目录(比如 C:\Users\张三\AppData\Roaming\Composer\Cache),导致 composer install --offline 静默跳过缓存,转而报网络错误。
根本原因是 Composer 内部某些路径拼接逻辑对空格和非 ASCII 字符处理不稳。最稳妥做法是:
- 用
composer config --global cache-dir D:/composer-cache显式重定向 - 确认该路径全英文、无空格、有读写权限
- 运行前执行
set COMPOSER_CACHE_DIR=D:\composer-cache(cmd)或$env:COMPOSER_CACHE_DIR="D:\composer-cache"(PowerShell)
离线场景下,缓存路径的“可预测性”比“符合默认习惯”重要得多——多一次手动配置,少半天排查。










