composer离线必须设composer_disable_network=1,否则必联网校验;需配合完整dist缓存、显式配置cache-dir、--prefer-dist及clean composer.lock,缺一即报错。

Composer 没有“每次自动回退到本地缓存”的机制,--offline 或 COMPOSER_DISABLE_NETWORK=1 是唯一能强制它只读本地的开关;但前提是缓存必须完整、路径必须显式配置、包类型必须是 dist,否则直接报错,不会尝试任何 fallback。
为什么 COMPOSER_DISABLE_NETWORK=1 是硬性前提
这个环境变量不是“可选优化”,而是离线流程的启动闸门。不设它,Composer 在解析 composer.lock 阶段就会主动请求 https://repo.packagist.org/packages.json,哪怕 vendor 目录已存在、缓存 ZIP 全在,也会卡在 Loading composer repositories 或报 Could not fetch。
- Linux/macOS:必须前置使用,如
COMPOSER_DISABLE_NETWORK=1 composer install --prefer-dist - Windows CMD:先
set COMPOSER_DISABLE_NETWORK=1,再运行命令 - PowerShell:用
$env:COMPOSER_DISABLE_NETWORK="1",注意不能用export - 漏设或拼写错误(如
composer_disable_network小写)均无效
--prefer-dist 不只是加速,它是缓存生效的唯一路径
Composer 缓存只保存 dist 类型包(zip/tar),不存 source(git clone)。如果 composer.lock 里某包的 dist.type 是 source,即使缓存目录里有同名 ZIP,--prefer-dist 也会失败——它严格按 lock 文件字段走,不模糊匹配。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 联网预下载时,必须加
--prefer-dist:如composer install --prefer-dist --no-scripts --no-plugins - 检查锁文件是否干净:运行
composer show --all --locked | grep "dist.type",确认全是zip或tar - 私有包若用了
"type": "package"+"dist"字段,ZIP 名必须为vendor/name-version.zip,大小写和分隔符一个都不能错
缓存路径必须显式重定向,不能依赖默认值
Composer 不会自动扫描你复制过来的 ~/.composer/cache/,除非你用 composer config --global cache-dir 明确告诉它新位置。更关键的是,cache-dir 必须指向**完整缓存根目录**(含 files/、repo/、archived/),只拷 files/ 会导致元数据缺失,仍触发网络请求。
- 联网机导出前:运行
composer config --global cache-dir /tmp/composer-cache,再执行安装 - 离线机导入后:先
composer config --global cache-dir /opt/my-project-cache,再解压整个缓存目录到该路径 - 避免中文路径:Linux/macOS 下
/home/张三/.composer/cache会导致file://URI 解析失败,报failed to open stream - 验证是否生效:加
-v运行composer install,看到Loading from cache而非Downloading才算成功
artifact 仓库是最可控的离线方案,但结构不能错
当项目依赖稳定、版本明确,type: "artifact" 比全局缓存更可靠:它绕过所有元数据校验,只解压 ZIP 并装 autoload。但它对 ZIP 命名和目录结构极度敏感,错一个字符就报 Package not found。
- ZIP 必须放在同一级目录下,如
/artifacts/monolog/monolog-2.13.0.zip - 项目
composer.json中添加:{"repositories": [{"type": "artifact", "url": "/artifacts"}]} - 确保
composer.lock中对应包的dist.url是相对路径(如monolog/monolog-2.13.0.zip),而非https://开头 - 别混用
artifact和path:后者适合开发中本地包,前者才是生产级离线部署主力
最易被忽略的一点:缓存完整性不是“有没有 ZIP”,而是 repo/ 下的 packages.json 是否包含该包的 sha256 映射。离线机上少一个 JSON 字段,Composer 就无法把 lock 文件里的哈希值关联到 ZIP 文件,最终还是报错。










