离线执行composer install报错的根本原因是composer默认强制联网校验元数据,必须设composer_disable_network=1并确保cache/files/、repo/、archived/三目录共存且路径正确配置,否则即使vendor完整也会静默失败。

为什么离线执行 composer install 还是报 Could not fetch
因为 Composer 默认行为是“先联网,再缓存”,哪怕 vendor/ 目录完整、composer.lock 一字未改,它也会坚持去请求 https://repo.packagist.org/packages.json。不显式切断网络,缓存和本地文件根本不会被读取。
唯一有效的硬性开关是环境变量 COMPOSER_DISABLE_NETWORK=1 ——不是 --no-network(该参数不存在),也不是 --offline(它只跳过更新,挡不住初始元数据请求)。
- Linux/macOS:必须前置设置,如
COMPOSER_DISABLE_NETWORK=1 composer install --prefer-dist - Windows CMD:先运行
set COMPOSER_DISABLE_NETWORK=1,再执行命令 - PowerShell:用
$env:COMPOSER_DISABLE_NETWORK="1"
composer install 离线成功依赖哪三个目录共存
缓存不是“ZIP 包仓库”,而是由三部分协同工作的元数据系统。缺任一,Composer 就 fallback 到联网,日志里仍出现 Fetching https://repo.packagist.org/packages.json。
-
files/:存放 ZIP/TAR 包本体(如monolog/monolog-2.12.0.zip) -
repo/:存放 JSON 映射表(如repo/https---packagist.org/packages.json),告诉 Composer “哪个 SHA 对应哪个 ZIP” -
archived/:用于composer archive场景的归档缓存
迁移时必须打包整个缓存根目录(路径用 composer config --global cache-dir 查),包括隐藏文件(如 .htaccess)。只拷 files/ 是最常见错误。
离线机上如何让 Composer 找到你拷来的缓存
即使缓存文件全量复制过去,Composer 仍会默认使用原路径(如 ~/.composer/cache),导致静默忽略你准备的缓存。
必须在离线机上同步执行:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
composer config --global cache-dir /path/to/restored/cache
验证是否生效:
- 检查
$(composer config --global cache-dir)/repo/https---packagist.org/packages.json是否存在且非空(内容应为 JSON 格式) - 运行
composer config --list | grep cache-dir确认输出是你指定的路径
为什么 vendor/ 拷过去后还要跑 composer install
直接拷贝 vendor/ 目录看似省事,但可能引发 autoload 冲突或脚本未执行问题。Composer 的默认行为是:即使 vendor/ 存在,只要没加压制参数,它仍会尝试重建 autoload、触发 post-install-cmd 或校验包完整性——而这些动作在离线时可能失败或绕过 COMPOSER_DISABLE_NETWORK。
安全做法是清空 vendor/,然后执行:
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader --prefer-dist --no-interaction
最后单独补 autoload:
composer dump-autoload -o
注意:--no-plugins 和 --no-scripts 必须带上,某些插件(如 hirak/prestissimo)或包的安装脚本会自行发起 HTTP 请求,绕过环境变量限制。
COMPOSER_DISABLE_NETWORK=1 是开关,但开关打开后,Composer 会严格校验缓存三件套是否齐全、路径是否对齐、JSON 是否可解析。少一个字段、多一个空格、路径没同步,都会导致静默失败而非明确报错。










