根本原因是composer默认只信任远程元数据,不验证本地缓存;必须同时满足:设composer_disable_network=1、composer.lock中所有包为dist类型且zip已按shasum落盘至cache-files-dir指定路径,并显式配置该路径。

离线状态下运行 composer install 报错,根本原因不是“没包”,而是 Composer 默认不信任本地任何东西——它坚持要联网验证元数据,哪怕 vendor/ 和 composer.lock 全在,也会卡在 Could not fetch https://repo.packagist.org/packages.json 或静默超时。
为什么加了 COMPOSER_DISABLE_NETWORK=1 还报错
这个环境变量是硬开关,但只拦住 Composer 主流程的 HTTP 请求。以下情况仍会连网:
- 某些插件(如
hirak/prestissimo)在post-install-cmd阶段自己调curl_init(),完全绕过该变量 - 部分包的
install脚本或phpstan/extension-installer类扩展会主动读远程配置 - 如果
composer.lock里某包的dist.url是https://开头,且没配本地仓库,COMPOSER_DISABLE_NETWORK=1下会直接退出,不是跳过
composer install 离线失败的三个隐藏前提没满足
光拷 vendor/ 和 composer.lock 不够,离线安装依赖三个条件同时成立:
-
composer.lock中每个包必须含"dist": {"shasum": "xxx", "url": "https://..."}字段(即用--prefer-dist生成) - 对应 ZIP 文件已按
shasum命名,落盘到缓存的files/子目录(如monolog/monolog/abc123.zip) - 离线机上执行前,必须显式运行
composer config --global cache-files-dir /path/to/offline-cache,否则 Composer 忽略你拷来的所有 ZIP
为什么只复制 ~/.composer/cache/files/ 目录就失败
缓存不是“ZIP 包仓库”,而是一套三件套协同系统:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
files/:存 ZIP 包本体 -
repo/:存packages.json映射表(告诉 Composer “symfony/console v6.4.0 对应哪个 ZIP”),缺它,Composer 不知道该用哪个文件 -
archived/:用于composer archive场景,虽非必需,但某些旧版逻辑会校验其存在
只拷 files/,等于只给了子弹,没给枪膛编号和击发指令。
Windows 用户最常踩的路径坑
路径分隔符写错会导致 Composer 完全找不到缓存目录:
- 正确写法:
D:/composer-cache或C:/Users/Name/AppData/Local/Composer/Cache - 错误写法:
D:\composer-cache(反斜杠被 PHP 解析为转义字符,\c变成控制符) - PowerShell 中设环境变量必须用:
$env:COMPOSER_DISABLE_NETWORK="1",CMD 用:set COMPOSER_DISABLE_NETWORK=1
真正离线成功的标志,不是命令跑完,而是 composer install -v 输出里不再出现任何 GET、Fetching 或 Downloading 字样——它应该从头到尾只读文件、解压、生成 autoload,全程无网络痕迹。










