离线部署失败主因是Composer未禁用网络,必须设COMPOSER_DISABLE_NETWORK=1,否则即使vendor存在也会请求packagist.org;私有包需改用path仓库或稳定版本,最后执行composer install --no-plugins --no-scripts --no-autoloader并dump-autoload。

根本不是“处理无法下载”,而是提前让 Composer 根本不尝试下载——离线部署失败,90% 是因为误以为 composer install 能自动降级到本地文件,它不能。
为什么 vendor 目录存在,composer install 还报 “Package not found”
这不是文件缺失,是 Composer 在安装前仍会向 packagist.org 发起元数据请求(哪怕只查一版号)。只要没显式切断网络通路,它就会卡在 Could not fetch https://repo.packagist.org/packages.json 或静默跳过包。
-
COMPOSER_DISABLE_NETWORK=1是硬性前提,否则任何--no-plugins或--no-scripts都拦不住初始校验 - 如果
composer.lock里某个包的dist.url是https://开头,且没配本地repositories,COMPOSER_DISABLE_NETWORK=1下会直接退出,不提示具体哪个包出问题 - 验证是否真离线:临时加
127.0.0.1 packagist.org到/etc/hosts,再跑composer install -v,看到Connection refused才算到位
composer install --prefer-dist 在离线机上为什么还是连网
因为 --prefer-dist 只是“倾向用 zip 包”,不是“强制只读本地”。它默认仍会去远程仓库比对 dist.shasum 是否一致。离线时这个比对必然失败,除非你提前把所有 dist 包放进本地缓存并配置好 repositories。
- 外网机执行
composer install --prefer-dist --no-interaction后,~/.composer/cache/files/下已存有全部vendor/name-hash.zip - 把这些 zip 按原结构拷到内网机,比如
/opt/composer-dist/ - 内网机运行:
composer install --prefer-dist --repository-url=file:///opt/composer-dist/ - 注意:该命令严格按
composer.lock中记录的dist.shasum查找对应 ZIP,校验失败即报错,不会退而求其次
私有包或 dev-master 在离线时为何总失败
这类包通常标记为 "type": "git" 或 "source",没有 dist 字段,也就没法打包成 zip。Composer 离线时找不到 source 元数据,直接放弃安装。
- 检查
composer.lock:搜索"source"字段,凡有该字段的包,都必须改用稳定版本约束(如"^3.0"替代"dev-master") - 私有 Git 包,改用
path类型仓库:"repositories": [{"type": "path", "url": "/path/to/local/package"}],然后把对应 Git 仓库完整 clone 到内网路径 - 若项目用了
"minimum-stability": "dev",离线时 Composer 无法解析 dev 分支 commit hash,必须删掉或设为"stable"
最简可靠的离线还原命令是什么
不是 composer install,而是三步组合拳:删旧、禁网、重装 autoload。
- 先清空目标机
vendor/(别留残留) - 设置环境变量:
COMPOSER_DISABLE_NETWORK=1 - 运行:
composer install --no-plugins --no-scripts --no-autoloader - 最后补一记:
composer dump-autoload -o,强制刷新映射,避免因路径变更或旧缓存导致类找不到
真正容易被忽略的是 vendor/composer/autoload_static.php 里的 $vendorDir——它在跨机器复制时可能写死绝对路径,导致 require 'vendor/autoload.php' 失败。所以不要只拷 vendor,要让它重新生成。











