离线服务器上 composer install 报错是因为默认从 packagist.org 拉包且无本地 fallback;必须提前在有网机执行 composer install --no-dev --prefer-dist 生成 vendor 和 lock 文件,确认无在线 repo 配置,再整传 vendor 和 lock 到离线机,运行时仅需 --ignore-platform-reqs(php 版本不一致时)。

为什么 composer install 在离线服务器上直接报错?
因为默认行为会去 packagist.org 拉包,连不上就卡在 Could not fetch https://repo.packagist.org/packages.json 或类似错误。离线环境不是“没网就能跳过”,而是 Composer 根本不尝试本地 fallback——它压根不知道你有缓存。
必须提前在有网机器上做三件事
缺一不可,顺序也不能乱:
- 用
composer install --no-dev --prefer-dist在有网机器上完整生成vendor/和composer.lock - 确认项目里没写死在线 repo(检查
composer.json里有没有"repositories"指向 https 地址) - 把整个
vendor/目录 +composer.lock打包传到离线服务器,不要只传composer.lock然后指望composer install自己拉
composer install 在离线服务器上要加什么参数?
只加一个:--ignore-platform-reqs(如果离线机 PHP 版本和开发机不一致),其他参数全是干扰项:
-
--no-scripts:可选,避免执行 require 的 post-install-cmd 脚本(比如生成 autoload) -
--no-plugins:可选,防止插件试图联网(比如某些私有 repo 插件) -
绝对不要加
--prefer-source或--dev:前者会触发 git clone,后者可能激活需要联网的 dev-only 包
最终命令通常是:composer install --no-dev --ignore-platform-reqs
vendor 目录传过去后还报 autoload 错误?
常见于没传全或权限不对:
- 检查
vendor/autoload.php是否存在且可读(PHP 进程用户要有读权限) - 确认
vendor/composer/autoload_*.php文件没被压缩工具意外损坏(尤其用 Windows 打 zip 再传 Linux) - 如果用的是自定义 autoloader(比如 PSR-4 映射到
src/),确保composer dump-autoload已在有网机执行过,且vendor/composer/autoload_static.php已生成
离线部署最麻烦的从来不是 Composer 命令本身,而是人以为“锁文件有了,vendor 就能活”,结果漏传了一个 autoload 文件,或者 tar 解压时丢了执行位。










