离线环境下composer install失败的根本原因是composer默认仍会联网解析lock文件、校验哈希、加载插件(如hirak/prestissimo)和执行脚本(如post-install-cmd),即使vendor存在也会卡在downloading或报connection refused;必须加--no-plugins --no-scripts禁用插件与脚本,否则隐式联网必然失败。

离线环境下 composer install 失败,不是因为“没网”本身,而是 Composer 仍试图联网做几件关键事:解析 composer.lock 中的包地址、校验哈希、加载插件、执行脚本。哪怕 vendor/ 已存在,它也大概率卡在 Downloading 或报 Connection refused。
为什么 --no-plugins --no-scripts 是硬性前提
不加这两个参数,Composer 会默认触发所有插件(比如 hirak/prestissimo 加速器)和 post-install-cmd 脚本(如 npm install、生成前端资源)。这些动作在离线时必然失败,且错误常被掩盖成“找不到包”或“超时”。
-
--no-plugins:禁用所有插件,包括自动下载加速、自定义仓库适配器等;不加它,插件可能主动发起 HTTP 请求 -
--no-scripts:跳过所有scripts字段定义的命令,避免因缺失node、npm或网络依赖导致中断 - 必须同时使用——只关一个,另一个仍可能拉垮整个流程
vendor 目录直接复制的前提条件很苛刻
直接拷贝 vendor/ 看似最省事,但只要漏掉任意一条,运行时就会爆 Class not found 或 undefined function。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- PHP 版本必须完全一致:8.2.12 和 8.2.13 之间可能存在内部 API 微调,autoload 机制会失效
- 所有扩展必须已启用:
mbstring、openssl、curl、json、phar、zlib缺一不可;用php -m | grep -E "mbstring|openssl|curl"实时验证 -
composer.lock必须原样保留,且不能被编辑;哪怕改一个空格,Composer 都会尝试重算依赖并联网 - 含
bin/的包(如phpunit)要求目标机php在$PATH中,且路径与源环境一致(例如都是/usr/bin/php)
最稳妥的离线方案:预下载缓存 + 本地安装
靠 vendor/ 复制风险高,靠 --no-plugins 强撑又容易漏掉脚本逻辑。真正可靠的做法是把所有 dist 包提前下全,让 Composer 从本地缓存读取。
- 联网机执行:
composer install --no-install --prefer-dist—— 这会把所有.zip包下载到~/.composer/cache/files/,不建vendor/ - 打包缓存:
tar -czf deps.tgz ~/.composer/cache/files/(注意路径不能错,不能用相对路径) - 目标机清空旧缓存:
composer clear-cache,再解压:tar -xzf deps.tgz -C ~ - 最后运行:
composer install --no-interaction—— 此时 Composer 会从本地缓存取包,全程不联网 - ⚠️ 注意:
~/.composer/cache/files/下的目录结构是vendor/name/version-hash/,文件名含哈希值,手动改名会导致匹配失败
容易被忽略的兼容性陷阱
很多人做完上述步骤仍失败,问题往往出在两个隐蔽点:
- 目标机 PHP 的
openssl.cafile或curl.cainfo指向了无效证书路径,导致即使离线,Composer 初始化阶段也会因 SSL 配置异常而退出(尤其 Windows 和 Alpine 容器常见);运行php -r "print_r(openssl_get_cert_locations());"确认default_cert_file是否有效 - 用了
--ignore-platform-reqs掩盖扩展缺失问题,看似装成功了,结果运行时才报Call to undefined function mb_strlen();这个参数不该用于离线部署,它只是把错误往后拖










