Composer无真正离线模式,必须设COMPOSER_DISABLE_NETWORK=1并配合--no-network、--prefer-dist及完整缓存(files/、repo/、archived/)才能跳过所有网络请求,否则解析lock文件时即报“Could not fetch”。

不能直接运行 composer install,必须显式切断网络通路、强制走 dist 包、并确保缓存结构完整——否则哪怕 vendor 目录存在,也会卡在 “Could not fetch packages.json”。
为什么 composer install 在无网时仍会报错
Composer 默认行为是:无论 vendor 是否存在、缓存是否齐全,只要没设禁网开关,它就会在解析 composer.lock 阶段主动请求 https://repo.packagist.org/packages.json。这不是超时问题,而是校验逻辑的一部分——它要确认包是否存在、版本是否合法,这个请求无法跳过。
- 错误典型表现:
Loading composer repositories卡住,或报Could not fetch https://repo.packagist.org/packages.json -
--offline不够用:它只跳过远程元数据更新和 dist 下载,但不阻止初始元数据请求 -
COMPOSER_DISABLE_NETWORK=1是硬性前提,缺了它,其他所有参数都无效
必须提前在联网机完成的三件事
离线机上能跑起来的前提,是联网机已生成可复用的缓存+元数据+锁文件组合。不是“下过包就行”,而是结构要对。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 执行
composer install --prefer-dist(不是--prefer-source):确保所有包以 zip/tar 形式下载并写入cache/files/ - 确认
composer.lock里每个包的dist.type是zip或tar,不是source;若有"type": "git"条目,离线时会失败 - 检查缓存目录是否含
repo/和files/子目录:$(composer config cache-dir)/repo/https---packagist.org/应有packages.json,files/下应有对应shasum命名的 zip 文件
离线机上运行的最小安全命令组合
光设环境变量不够,还要绕过可能触发网络调用的插件和脚本。最稳的一行命令是:
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader --prefer-dist --no-interaction
-
--no-plugins:防止hirak/prestissimo或phpstan/extension-installer等插件内部发起 HTTP 请求 -
--no-scripts:屏蔽post-install-cmd,避免脚本里调用外部 API 或生成配置时出错 -
--no-autoloader:跳过 autoload 重建,某些自定义 autoloader 实现会在类加载阶段尝试远程查找 - 执行完必须补一记:
composer dump-autoload -o,否则运行时大概率报Class not found
Windows 用户最容易踩的坑:缓存路径含中文或空格
Composer 内部路径拼接对非 ASCII 字符处理不稳,会导致 COMPOSER_DISABLE_NETWORK=1 下静默跳过缓存,转而报网络错误。
- 不要用默认路径如
C:\Users\张三\AppData\Roaming\Composer\Cache - 显式重定向缓存:
composer config --global cache-dir D:/composer-cache - CMD 中运行前执行:
set COMPOSER_CACHE_DIR=D:\composer-cache - PowerShell 中运行前执行:
$env:COMPOSER_CACHE_DIR="D:\composer-cache"
缓存迁移必须包含 files/、repo/、archived/ 三个子目录,少一个都会 fallback 到联网尝试——尤其 repo/ 缺失时,Composer 根本不知道哪个 zip 对应哪个 shasum。

















