离线环境下composer install失败,根本原因是Composer默认只信任远程元数据、不查本地缓存;必须同时满足三条件:设COMPOSER_DISABLE_NETWORK=1、composer.lock全为dist类型且ZIP按shasum落盘至cache-files-dir指定路径、显式配置该路径。

离线环境下 composer install 报错,90% 不是没包,而是 Composer 根本没读你拷来的缓存——它默认只信远程元数据,不查本地 files/ 目录。必须同时满足环境变量、缓存结构、路径配置三者,缺一不可。
COMPOSER_DISABLE_NETWORK=1 是硬开关,但光设它没用
这个环境变量只是拦住主流程的 HTTP 请求,比如不访问 https://repo.packagist.org/packages.json;但它不会让 Composer 主动去读缓存。如果你只加了它,却没配对的 ZIP 包或路径错误,结果还是报 Could not fetch 或静默卡住。
- Linux/macOS:执行前加前缀,
COMPOSER_DISABLE_NETWORK=1 composer install --prefer-dist --no-scripts --no-plugins - Windows CMD:
set COMPOSER_DISABLE_NETWORK=1 && composer install --prefer-dist --no-scripts --no-plugins - PowerShell:
$env:COMPOSER_DISABLE_NETWORK="1"; composer install --prefer-dist --no-scripts --no-plugins - 别漏掉
--prefer-dist:只有 dist 类型包(ZIP/TAR)才走缓存路径;"type": "git"的包会直接失败
缓存目录必须完整,且只认 cache-files-dir
cache-dir 和 cache-files-dir 不是一回事:cache-dir 是顶层根目录(含 files/、repo/、archived/),而离线安装真正读取的是 cache-files-dir 下的 ZIP 文件。只复制 files/ 子目录,不配路径,等于白拷。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 联网机预打包前,先运行:
composer config --global cache-files-dir /mnt/offline-cache - 确认 ZIP 已落盘:
ls /mnt/offline-cache/monolog/monolog/*.zip(文件名由dist.shasum决定) - 检查
repo/是否存在且非空:cat /mnt/offline-cache/repo/https---packagist.org/packages.json | head -n 5 - 离线机上必须同步执行:
composer config --global cache-files-dir /mnt/offline-cache,否则仍读默认~/.composer/cache/files/
路径含中文或反斜杠,会导致 file:// URI 解析失败
Composer 内部拼接 file:///path/to/xxx.zip 时,若路径含未转义中文或 Windows 反斜杠,file_get_contents() 会直接报 failed to open stream: No such file or directory,而不是提示“找不到包”。
- 预下载阶段就用纯英文路径:
composer config --global cache-dir /tmp/composer-cache-en(Linux/macOS)或C:\composer-cache(Windows) - Windows 用户注意:用
C:/composer-cache或C:\composer-cache都可能出问题,推荐统一用正斜杠C:/composer-cache - 离线机上显式设环境变量:
export COMPOSER_CACHE_DIR=/tmp/composer-cache-en(Linux/macOS)或set COMPOSER_CACHE_DIR=C:/composer-cache(CMD) - 验证方式:
composer show monolog/monolog --locked查dist.shasum,再手动ls对应 ZIP 是否存在
插件和脚本会绕过 COMPOSER_DISABLE_NETWORK
COMPOSER_DISABLE_NETWORK=1 拦不住某些插件内部发起的 HTTP 请求。比如 hirak/prestissimo 在 post-install 阶段自己拉包,phpstan/extension-installer 读远程配置,这些行为完全不受环境变量控制。
- 必须加
--no-plugins --no-scripts参数,彻底禁用所有插件和生命周期脚本 - 如果项目依赖强制启用了某插件(如
composer.json中有"extra": {"installer-paths": {...}}),考虑临时注释掉再试 - CI 打包时,避免全局 require 插件;离线机上不要运行
composer global require - 报错里出现
post-install-cmd或pre-autoload-dump相关日志,基本可判定是脚本绕过导致
最容易被忽略的点:不是缓存目录空,而是 repo/ 下的 JSON 映射表缺失或损坏——Composer 需要它把 composer.lock 里的包名+版本,映射到本地 ZIP 文件路径。哪怕 files/ 里 ZIP 全在,没有这张表,它也不知道该读哪个文件。

















