离线安装成功需确认三件事:1. 目标机PHP版本与扩展须与打包环境一致;2. composer.lock必须存在且未修改;3. 所有依赖包须已完整下载并缓存。

离线安装依赖前必须确认的三件事
离线安装不是简单把 vendor 文件夹拷过去就能跑通——Composer 会校验包完整性、检查平台约束、解析依赖图,缺一不可。离线能成功,前提是「环境一致性」和「元数据完整」。
- 目标机器 PHP 版本、扩展(如
openssl、json)必须与打包环境一致,否则composer install会在 autoload 生成或脚本执行阶段直接报错 -
composer.lock文件必须存在且未被修改,它是离线安装的唯一权威依据;没有它,composer install会退化成composer update,触发联网行为 - 所有依赖包(含
dist和source)必须已通过composer install --no-dev或--with-all-dependencies完整下载并缓存,仅靠本地vendor目录不够
用 composer install --no-interaction --no-plugins --no-scripts 确保纯离线执行
默认 composer install 可能触发插件(如 hirak/prestissimo)、执行 post-install-cmd 脚本,甚至尝试连 Packagist 检查更新——这些都会在离线时卡死或报错。
-
--no-interaction:禁用任何交互式提示(比如认证询问),避免卡住 -
--no-plugins:跳过所有插件,防止插件内部发起 HTTP 请求 -
--no-scripts:不执行post-install-cmd等脚本,常见于生成 autoload、清缓存等操作,它们可能依赖外部工具或网络 - 务必配合
-v(verbose)运行一次,观察是否仍有Downloading或Fetching日志——有就说明某处仍试图联网
备份和恢复 Composer 全局缓存才是可靠离线方案
只拷 vendor 和 composer.lock 是脆弱的:不同系统路径权限、符号链接、Windows/macOS/类 Unix 下的 autoload_static.php 生成逻辑都可能出问题。真正可迁移的离线包,是 Composer 自己管理的缓存目录。
- 缓存位置由
composer config --global cache-dir决定,默认 Linux/macOS 是~/.composer/cache,Windows 是%LOCALAPPDATA%\Composer\cache - 备份时直接打包整个
cache目录(含files/、repo/、archived/),它包含所有已下载的 ZIP/TAR 包及校验信息 - 恢复时,在目标机器上先运行
composer config --global cache-dir /path/to/restored/cache,再执行composer install——Composer 会优先从该缓存读取,完全不联网 - 注意:缓存中包名哈希路径与 Composer 版本强相关,建议两端使用相同
composer --version(如都是 2.5.x),否则可能命中失败
composer install 报 file could not be downloaded 的真实原因
这不是网络问题,而是离线环境下最典型的元数据断裂信号。常见于以下情况:
-
composer.lock中某个包的dist.url是 HTTPS 链接,但本地缓存里没对应文件——说明该包根本没被下载过,或被composer clear-cache清掉了 - 你用了
require的 dev 分支(如"monolog/monolog": "dev-main"),而lock文件记录的是 commit hash,但缓存里只有 tag 包,没对应 commit 的 ZIP - PHP 平台配置不匹配:比如
composer.lock标记了"platform": {"php": "8.2"},但目标机器是 PHP 8.1,则 Composer 会尝试重新解析依赖树,进而触发联网找兼容版本
解决方法只有一个:回到联网环境,用完全相同的 PHP 版本和 composer.json,运行 composer install --no-dev 生成全新 lock 和完整缓存,再迁移。










