composer如何离线安装依赖_composer离线包管理方案【实操】

2次阅读

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

composer如何离线安装依赖_composer离线包管理方案【实操】

离线安装前必须确认的三件事

离线安装不是简单复制 vendor 目录,核心前提是:目标环境的 PHP 版本、扩展(如 openssljson)、架构(x86_64/arm64)和源环境一致,否则 composer install 会因平台约束或扩展缺失直接失败。

  • 运行 composer show --platform 对比两台机器的平台信息
  • 检查 composer.json 中是否含 "platform": {"php": "..."},它会强制锁定 PHP 版本行为
  • 确认所有包不含 post-install-cmdpost-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 中对应条目(字段包括 nameversiondisttype),否则 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('MonologLogger') ? 'ok' : 'fail';",比看命令行输出更可靠。

text=ZqhQzanResources