离线安装失败主因是Composer默认联网校验元数据,必须设COMPOSER_DISABLE_NETWORK=1并执行composer install --no-interaction --no-plugins --no-scripts --no-dev --optimize-autoloader,再运行composer dump-autoload -o;vendor和lock完整仍报错,是因为校验包存在性、版本、哈希等行为无法跳过,除非彻底切断所有网络路径。

离线导入失败,几乎全是因 Composer 仍试图联网校验——哪怕 vendor/ 和 composer.lock 都齐全,不显式掐断所有网络路径,composer install 就会卡在 Could not fetch https://repo.packagist.org/packages.json 或直接报 Connection refused。
为什么 vendor 存在、lock 文件完整,install 还是失败
错误根源不在文件缺失,而在 Composer 默认行为:即使 vendor/ 已满,composer install 仍会主动请求远程元数据(比如校验包是否存在、版本是否合法、哈希是否匹配)。这个步骤无法跳过——除非你切断所有触发路径。
-
COMPOSER_DISABLE_NETWORK=1是硬性前提,不设它,所有--no-xxx参数都无效 - 全局残留
repo.packagist配置会导致 fallback 校验,必须运行composer config --global repo.packagist false彻底禁用 -
composer.lock中有"source"类型条目(如"dev-master"或 Git URL),离线时无法校验,install必然失败 - 项目
composer.json里写了"repositories": [{"type": "packagist", "url": false}],在COMPOSER_DISABLE_NETWORK=1下也会直接退出,不是静默忽略
最稳的离线 install 命令组合
这组参数不是“可选优化”,而是防止意外联网的强制防护。前提是:vendor/ 已存在、composer.lock 未改动、PHP 版本和必需扩展(mbstring、openssl、zlib)完全一致。
-
--no-interaction:跳过任何交互提示(如 license 确认) -
--no-plugins:跳过插件初始化,避免phpstan/extension-installer等隐式联网 -
--no-scripts:屏蔽post-install-cmd,防止脚本调用外部 API 或生成前端资源 -
--no-dev:不安装require-dev包,减小体积并规避 dev-only 插件 -
--optimize-autoloader:强制重建vendor/autoload.php,避免残留旧路径导致Class not found
执行前务必确认环境变量已设:COMPOSER_DISABLE_NETWORK=1,再运行:
COMPOSER_DISABLE_NETWORK=1 composer install --no-interaction --no-plugins --no-scripts --no-dev --optimize-autoloader
完成后补一句:composer dump-autoload -o,确保自动加载器干净。
本地 path 仓库配置常见失效点
本地仓库不是“放好目录就能用”,它对路径、结构、权限极其敏感,错一个字符就静默跳过,连错误都不报。
-
repositories必须写在主项目composer.json的最外层,不能塞进require、config或其他字段里 -
url必须指向一个**含composer.json的目录**,不是文件本身,也不能以/结尾("../my-pkg/"会失效) - 本地包目录下的
composer.json必须有合法name字段,且与require中写的**逐字一致**(大小写、短横线-、vendor 名全部对齐) - Windows 下默认不支持符号链接,必须在本地包自己的
composer.json里加"options": {"symlink": true},且终端需以管理员身份运行 - CI/CD 或 Docker 中不要用 path 仓库——上线环境根本不该存在,构建机没有你的
../my-pkg路径,composer install会直接报错或跳过
真正容易被忽略的是:离线部署不是“断网就能自动切换”,也不是“拷了 vendor 就完事”。它要求你提前切断所有可能的联网触点——从环境变量、全局配置、lock 文件内容,到本地仓库的 Git 状态和 symlink 权限,漏掉任意一环,都会在目标机器上突然失败,且错误信息毫无指向性。











