离线安装失败的核心原因是Composer默认强制联网校验元数据,必须设COMPOSER_DISABLE_NETWORK=1、确保composer.lock合法且vendor为空、PHP环境一致,否则即使vendor存在也会报“Could not find package”。

Composer install 时提示 “Could not fetch” 是离线失败的典型信号
Composer 默认全程联网,只要任意一个包源(packagist.org 或私仓)不可达,composer install 就会卡在“fetching”并报错,比如:Could not fetch https://packagist.org/p2/monolog/monolog.json。这不是配置问题,而是环境不具备离线安装前提——你得先有完整、可复用的依赖快照。
离线安装前必须确认 vendor 和 composer.lock 已就位
离线安装不是“断网后运行 install”,而是“在无网络时复现上一次成功安装”。这要求两个硬性条件同时满足:
-
vendor/目录必须存在且完整(含所有包的autoload.php、src/、bin/等),不能是空目录或只含部分包 -
composer.lock文件必须与当前vendor/严格匹配——即该 lock 文件正是生成此 vendor 的依据;如果 lock 被改过、删过、或来自另一台机器但未同步 vendor,composer install --no-install会拒绝执行 - 运行
composer install --dry-run可快速验证:若输出 “Nothing to install or update”,说明环境已满足离线条件;若提示 “Installing …” 或 “Updating …”,说明 vendor 缺失或 lock 不匹配,不能离线
用 composer install --no-scripts --no-plugins --no-dev 更安全地跳过联网环节
即使满足前两条,某些插件(如 hirak/prestissimo)或脚本(如 post-install-cmd)仍可能触发 DNS 查询或远程调用。为彻底规避网络,建议加三重防护:
-
--no-scripts:跳过所有scripts配置项(包括post-autoload-dump等常见钩子) -
--no-plugins:禁用全部插件,防止像composer-asset-plugin这类老插件尝试访问 GitHub API -
--no-dev:不加载require-dev中的包(除非你明确需要 dev 包且已提前装好) - 完整命令示例:
composer install --no-scripts --no-plugins --no-dev --ignore-platform-reqs(--ignore-platform-reqs在目标机 PHP 版本/扩展不一致时可避免报错)
vendor 压缩包 + lock 文件才是真正的离线交付物
很多人误以为拷贝 composer.lock 就够了,结果在新机器上 install 依然联网。真正可交付的离线包是:vendor/ 打包成 tar.gz 或 zip + 原始 composer.lock。解压后直接运行 composer install --no-install(该参数强制跳过下载和解包,仅校验 lock 与 vendor 一致性),才能确保零网络介入。漏掉 vendor 就等于没带“货”,只有“发货单”。


















