离线安装前必须确认composer.lock与缓存匹配,否则报“Package not found”;需检查dist.type是否为zip/tar、验证shasum对应文件是否存在、统一Composer主版本、避免中文缓存路径,并强制设置COMPOSER_DISABLE_NETWORK=1。

离线安装前必须确认 composer.lock 和缓存是否匹配
离线环境下 composer install 报 “Package not found” 或 “Could not fetch”,往往不是网络没关,而是 composer.lock 里某个包的 dist.shasum 在本地缓存中根本不存在。Composer 不会模糊匹配,它严格按 lock 文件中的哈希值去 ~/.composer/cache/files/ 下找对应文件(如 monolog/monolog/7a8e0d4b12c3.zip)。
- 在联网机执行
composer show --all --locked,检查每个包的dist.type是否为zip或tar;若出现source,说明该包走了 Git 克隆,无法被缓存复用 - 用
find ~/.composer/cache/files -name "*${shasum:0:8}*.zip"手动验证关键包是否存在(${shasum:0:8}是dist.shasum前 8 位) - 确保两端 Composer 主版本一致(如都是 2.7.x),否则缓存结构不兼容,
files/目录下文件名规则可能不同
本地缓存路径含中文时要避免路径解析失败
Linux/macOS 下若缓存路径含中文(如 /home/张三/.composer/cache),file:// 协议 URL 会因未转义导致解析异常——Composer 内部调用 cURL 或 fopen 时可能把中文字符当非法 URI,报错 failed to open stream: No such file or directory。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 迁移缓存前,先在联网机运行
composer config --global cache-dir /tmp/composer-cache-en,强制使用纯英文路径 - 离线机上也统一设为英文路径:
composer config --global cache-dir /opt/composer-cache,再解压缓存包到该目录 - 不要依赖默认的
$HOME路径,尤其 Windows 用户:PowerShell 中$env:USERPROFILE可能返回C:\Users\张三,应改用C:\composer-cache这类无中文路径
COMPOSER_DISABLE_NETWORK=1 是硬性开关,不是可选项
即使缓存齐全、composer.lock 正确,不设 COMPOSER_DISABLE_NETWORK=1 就运行 composer install,仍会卡在 Loading composer repositories 或报 Could not fetch https://repo.packagist.org/packages.json。这不是超时,是 Composer 在锁文件解析阶段主动发起的元数据请求。
- Linux/macOS:前置环境变量,如
COMPOSER_DISABLE_NETWORK=1 composer install --prefer-dist --no-plugins --no-scripts - Windows CMD:
set COMPOSER_DISABLE_NETWORK=1 && composer install --prefer-dist --no-plugins --no-scripts - PowerShell:
$env:COMPOSER_DISABLE_NETWORK="1"; composer install --prefer-dist --no-plugins --no-scripts -
--no-plugins和--no-scripts必须同时加,否则某些插件(如phpstan/extension-installer)会在内部发 HTTP 请求,绕过COMPOSER_DISABLE_NETWORK
模拟安装 ≠ 复制 vendor,而要走完整 install 流程
直接把联网机的 vendor/ 拷到离线机,再运行 composer install,大概率失败。因为 Composer 默认仍会校验 autoload 映射、触发插件初始化、重读 composer.lock 并尝试比对远程元数据。
- 正确做法:离线机上先清空
vendor/(rm -rf vendor),再执行带COMPOSER_DISABLE_NETWORK=1的 install 命令,强制它从缓存重建整个目录 - 若需跳过 autoload 生成(比如只验证包完整性),加
--no-autoloader;但后续运行 PHP 代码前必须补上composer dump-autoload --classmap-authoritative - 不要删
composer.lock,哪怕 vendor 已存在——lock 文件是离线安装的唯一权威依据,改了就等于放弃离线能力
dev-master 这类不稳定版本:它们没有固定 dist.shasum,离线时无法定位对应 zip,必须提前在联网机转成具体语义化版本。

















