离线安装前必须确认三件事:一是目标环境与源环境的PHP版本、扩展和架构一致;二是检查composer.json中无"platform"锁定及post-install-cmd等联网脚本;三是确保所有依赖已完整构建并校验autoload可用。

离线安装前必须确认的三件事
离线安装不是简单复制 vendor 目录,核心前提是:目标环境的 PHP 版本、扩展(如 openssl、json)、架构(x86_64/arm64)和源环境一致,否则 composer install 会因平台约束或扩展缺失直接失败。
- 运行
composer show --platform对比两台机器的平台信息 - 检查
composer.json中是否含"platform": {"php": "..."},它会强制锁定 PHP 版本行为 - 确认所有包不含
post-install-cmd或post-autoload-dump脚本——这些在离线环境无法联网执行
用 composer archive 打包单个依赖(适合少量私有包)
当只有 1–2 个内部包需离线部署,且已发布到私有仓库(如 Satis 或 Packagist private mirror),可直接下载其 zip 包而非走 Composer 流程:
- 访问包的
dist.url(从composer show vendor/name -s查看),例如https://repo.example.com/dists/vendor-name-1.2.3.zip - 用
wget或浏览器下载该 zip,解压到vendor/vendor/name/ - 手动补全
vendor/composer/installed.json中对应条目(字段包括name、version、dist、type),否则composer dump-autoload会忽略它
完整离线依赖树:用 composer install --no-scripts --no-plugins + vendor/ 同步
这是最常用也最稳妥的方式,本质是「在有网机器上完整构建 vendor,再整体搬运」:
- 在与目标环境完全一致的开发机上,执行:
composer install --no-dev --no-scripts --no-plugins --optimize-autoloader -
--no-dev排除require-dev包,减小体积;--optimize-autoloader生成扁平类映射,避免离线后因 autoloader 逻辑异常导致类找不到 - 打包整个
vendor/和composer.lock(二者必须版本严格匹配),传输至目标机器 - 目标机只需执行:
composer install --no-dev --no-scripts --no-plugins—— 此时 Composer 仅校验 lock 文件与 vendor 结构,不联网也不重装
私有包无法下载?用 path repository 替代远程源
若项目依赖本地路径下的私有包(如公司内部 SDK),而目标环境无法访问内网 Git 或 Satis,需改用 path 类型仓库:
- 在
composer.json中添加:"repositories": [ { "type": "path", "url": "./packages/my-sdk" } ] - 将
./packages/my-sdk整个目录随项目一起打包传输(确保含composer.json) -
composer install会直接 symlink 或 copy 该路径内容,全程不触发网络请求 - 注意:
path仓库在composer update时会读取最新代码,但install仅按lock中记录的 commit 或 version 安装,所以务必先在有网机上update锁定版本
vendor/autoload.php 是否真能加载关键类——建议在目标机跑一句 php -r "require 'vendor/autoload.php'; echo class_exists('Monolog\Logger') ? 'ok' : 'fail';",比看命令行输出更可靠。










