离线安装依赖需确保 vendor 目录可复用且系统一致;必须有有效的 composer.lock;注意 php 版本、扩展及平台约束兼容性;避免路径信息污染和权限问题。

离线安装依赖前,先确认 vendor 目录是否可复用
如果目标机器和开发机系统一致(同为 Linux、PHP 版本和扩展相同),最省事的方式是直接打包整个 vendor 目录。Composer 本身不校验平台指纹,但某些包(如 ext-redis 依赖的 phpredis)在不同架构或 PHP 编译选项下会报 undefined symbol 错误。
- 开发机执行
composer install --no-dev --optimize-autoloader,确保无冗余文件 - 压缩时排除
vendor/bin中的软链接(Windows 下可能失效)、vendor/composer/installed.json(含绝对路径,可能引发 autoload 异常) - 目标机解压后运行
composer dump-autoload -o,强制刷新 autoloader,避免因路径变更导致类找不到
composer install 离线模式依赖 composer.lock,不是 composer.json
离线时 composer install 只读取 composer.lock 中记录的精确版本、哈希值和 dist URL;它不会访问 packagist.org,也不会解析 composer.json 中的 ^ 或 ~ 版本约束。一旦 composer.lock 缺失或被删,离线安装就失败。
- 开发机必须先成功运行过
composer install或composer update,生成有效的composer.lock - 若锁文件里有 private package(如 GitLab 私库地址),目标机需能访问该地址——这不算“纯离线”,要提前把私包也打包进 vendor 或换为 dist 归档
- 检查锁文件完整性:
composer validate --no-check-publish,防止因手动编辑引入格式错误
用 composer archive 打包单个包时,注意它不处理依赖树
composer archive 只打包指定包的源码(如 monolog/monolog),不会递归打包其依赖(比如 psr/log)。想靠它实现“一个命令打全量”会漏包。
- 适合场景:仅需离线安装某一个轻量工具包(如
symfony/console),且已知其无额外 require - 执行前先
composer require --no-update monolog/monolog,再composer archive monolog/monolog,否则可能打包到 dev-only 的代码 - 生成的
.tar文件需手动解压到vendor/monolog/monolog,并补上vendor/composer/installed.php中对应条目(否则 autoloader 找不到)
PHP 版本与平台约束可能让离线安装静默失败
Composer 在 install 阶段会检查 platform 配置(如 "php": "8.1.0")和包的 require.php 字段。若目标机 PHP 是 8.0,而锁文件里某个包声明只支持 >=8.2,composer install 会跳过它——不报错,但后续 require 时抛 Class not found。
- 开发机运行
composer show --platform,确认所设 platform 值与目标机一致 - 用
composer why-not php:8.0(替换为目标版本)提前排查兼容性问题 - 某些包(如
laravel/framework)在 lock 文件中隐含对扩展的强依赖(如ext-mbstring),目标机缺扩展时 Composer 不提示,只在运行时报 fatal error
composer install -v 的输出,比反复打包更省时间。










