Composer install在没网时卡在Loading composer repositories,是因为默认只信任远程元数据而非本地缓存;必须设置COMPOSER_DISABLE_NETWORK=1强制禁网,并确保cache-files-dir指向含files/、repo/、archived/三部分的完整缓存路径,否则仍会静默失败。

为什么composer install在没网时会卡在Loading composer repositories
因为 Composer 默认不信任本地缓存,哪怕 ~/.composer/cache/files/ 里有 ZIP、vendor/ 目录完整,它仍会先发起 HTTP 请求去拉 https://repo.packagist.org/packages.json。这不是 bug,是设计逻辑:它只把远程元数据当“唯一真相”,本地缓存只是加速手段,不是 fallback 路径。
真正生效的离线开关只有一个:COMPOSER_DISABLE_NETWORK=1。这个环境变量强制跳过所有网络触发点——包括元数据拉取、dist 下载、插件初始化时的远程校验。没设它,--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"
cache-dir 和 cache-files-dir 到底谁管 ZIP 文件?
两者不是一回事:cache-dir 是顶层缓存根目录(含 files/、repo/、archived/),而离线安装真正读取 ZIP 的路径是 cache-files-dir 指向的 files/ 子目录。如果只改了 cache-dir,没同步设 cache-files-dir,Composer 仍会去默认路径找 ZIP,导致静默失败。
实操中必须显式配置:
- 联网机打包前:运行
composer config --global cache-files-dir /mnt/nfs/composer-offline-cache,再执行composer install --prefer-dist - 离线机还原后:必须执行
composer config --global cache-files-dir /mnt/nfs/composer-offline-cache,否则无效 - Windows 用户注意路径分隔符:用
D:/composer-cache,别用D:\composer-cache(反斜杠会被截断)
缓存目录迁移时最容易漏掉哪三部分?
缓存不是“ZIP 包仓库”,而是三部分协同工作的元数据系统。缺任一,Composer 就 fallback 到联网:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
files/:存放 ZIP 包,文件名由shasum决定(如monolog/monolog/abc123.zip) -
repo/:存放 JSON 映射表,告诉 Composer “symfony/console v6.4.0对应哪个 ZIP 的 sha256”;关键文件是repo/https---packagist.org/packages.json,必须存在且非空 -
archived/:用于composer archive场景,离线安装虽不强依赖,但缺失可能影响某些插件行为
常见错误是只拷 files/。验证是否完整:解压后检查 repo/https---packagist.org/packages.json 是否可读、内容为有效 JSON。
为什么加了 --no-plugins --no-scripts 还会连网?
COMPOSER_DISABLE_NETWORK=1 只拦 Composer 主流程的 HTTP 请求,拦不住某些插件或脚本内部发起的调用。比如:
-
hirak/prestissimo插件会在post-install阶段自己拉包 -
phpstan/extension-installer可能读远程配置 - 自定义
post-install-cmd脚本里写了file_get_contents("https://...")
所以离线命令必须带上 --no-plugins --no-scripts --no-autoloader,避免这些“绕过层”触发 DNS 或 HTTP 请求。如果项目必须用某插件,得确认它支持离线模式,或提前把所需资源固化进本地 repo。
最易被忽略的是缓存路径与环境变量的双重绑定:离线机上既要设 COMPOSER_DISABLE_NETWORK=1,又要确保 cache-files-dir 指向真实存在的、含完整三部分结构的路径——少一个字符、多一个空格、路径里含中文未转义,都会让整个离线链路静默失效。

















