离线安装必须显式设composer_disable_network=1并执行composer install --no-plugins --no-scripts --no-autoloader,再运行composer dump-autoload -o;vendor存在仍报错是因默认校验远程元数据,该行为无法跳过,除非切断网络通路并绕过高风险环节。

离线环境不能靠“断网”自动触发,必须显式禁用网络行为并绕过所有远程校验环节,否则 composer install 一定会失败。
为什么 vendor 存在、lock 文件完整,install 还报 Could not fetch?
Composer 默认会在 install 阶段主动请求远程元数据(比如校验包是否存在、版本是否合法),这个行为不依赖 vendor 是否存在,也无法跳过——除非你明确切断所有网络通路,并关闭所有可能触发联网的开关。
-
COMPOSER_DISABLE_NETWORK=1是硬性前提,不设它,--no-plugins等参数全无效 - 全局配置残留
repo.packagist会导致 fallback 校验,必须运行composer config --global repo.packagist false彻底禁用 -
composer.json里写了"repositories"字段(哪怕内容为空),也会让 Composer 尝试解析,离线时直接退出 - 如果
composer.lock中某个包是"source"类型(如 Git URL 或dev-main),离线无法校验,install 必然失败
离线 install 的最小安全命令组合
这组参数不是“可选优化”,而是防止意外联网的强制防护。前提是:vendor/ 已存在、composer.lock 未改动、PHP 版本和必需扩展(mbstring、openssl、zlib)完全一致。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
--no-plugins:跳过插件初始化,避免phpstan/extension-installer等隐式联网 -
--no-scripts:屏蔽post-install-cmd,防止脚本调用外部 API 或生成配置 -
--no-autoloader:绕过 autoload 重建,某些自定义实现会触发远程类查找 - 执行完必须立刻补一记:
composer dump-autoload -o,否则运行时大概率报Class not found
如何离线添加新包?
composer require 默认必须联网查包名和版本,离线不可用。唯一可靠方式是把本地目录当仓库用:
- 目标包根目录下必须有合法
composer.json,含完整"name"(如"acme/utils")和"version"或分支标识(如"dev-main") - 项目根目录
composer.json中添加:"repositories": [{"type":"path","url":"./packages/my-utils"}](注意:url必须是相对路径;Windows 要带盘符,如C:/projects/my-pkg) - 然后运行
composer require acme/utils,Composer 会从本地路径加载,不发任何网络请求
容易被忽略的权限与缓存陷阱
很多“离线失败”其实是环境状态污染导致的静默错误:
- 检查
ls -ld vendor/ composer.lock $(composer config --global home),若任一路径归属为root,说明被sudo污染过,当前用户无权读取缓存或写入 autoload - Windows 用户需手动删掉
%LOCALAPPDATA%\Composer\cache,否则 Composer 可能从旧缓存读取失效的 dist URL -
COMPOSER_DISABLE_NETWORK=1下,若composer.json含"type": "project"且没配repositories,Composer 仍会尝试访问 packagist.org 元数据——这是设计缺陷,只能靠提前清理配置规避










