composer如何在air-gapped环境中工作?

8次阅读

composer在无网络环境需提前准备依赖包并配置本地源才能离线安装;关键步骤包括:有网时生成完整vendor和lock文件、打包携带至隔离环境,或配置path型本地仓库并禁用packagist源。

composer如何在air-gapped环境中工作?

Composer 在无网络环境(air-gapped)下不能直接工作,它默认依赖远程 Packagist 和 git 仓库;但可以提前准备、离线缓存、本地替换源,实现“伪离线”安装。

如何让 composer install 在没网时成功运行

前提是项目已完整生成过 vendor/composer.lock,且你提前把依赖包全部下载并打包带入隔离环境。

  • 在有网机器上执行 composer install --no-dev(或加 --with-all-dependencies 确保锁文件所有条目都落地)
  • composer archive 或手动压缩整个 vendor/ 目录(注意保留符号链接和文件权限)
  • 把压缩包 + composer.lock + composer.json 一并拷入 air-gapped 机器
  • 解压到项目根目录后,composer install --no-interaction --no-plugins --no-scripts 可跳过联网校验,仅做路径检查和 autoload 生成

如果缺少任意一个 vendor/ 子目录或文件,composer install 会报 Package ... not found 并中断——它不会尝试从本地找,除非你改源。

composer config 把 Packagist 换成本地路径仓库

这是真正支持“无网安装新项目”或“更新部分包”的方式:把 Composer 当成纯本地包管理器,不碰 http

  • 先用 composer archivegit clone --depth 1 把每个依赖的 Git 仓库或 ZIP 包拉下来,统一放在比如 /opt/composer-mirror/ 下,结构如:/opt/composer-mirror/vendor/name/package/1.2.3/
  • 在项目中执行:composer config repositories.local-path path /opt/composer-mirror
  • 再执行 composer config repos.packagist false 关掉默认源
  • 此时 composer require vendor/name 会去本地路径匹配版本,而不是发 HTTP 请求

注意:path 类型仓库要求目录里必须含有效的 composer.json,且版本号要和 composer.lock 中声明的一致,否则会提示 Could not find package ... at version ...

composer installFailed to decode responsefile_get_contents(): ssl operation failed 的真实原因

这些错误不是网络不通的表象,而是 Composer 已开始尝试连接 Packagist 或 github —— 说明你还没关掉远程源,或者 composer.lock 里记录了需要从远程 fetch 的 dist URL(比如 "dist": {"url": "https://api.github.com/..."})。

  • 运行 composer config -l | grep repos 确认 repos.packagist 是否为 false
  • 检查 composer.lock 中每个包的 dist.url 字段:如果是 HTTPS 地址,就得提前下载好对应 ZIP,并用 repositories 指向本地解压路径;若留着远程地址,哪怕配置了本地源,Composer 仍会优先走 dist 下载
  • 更稳妥的做法是生成 lock 文件前就设好本地源,并用 composer update --lock 强制重写 lock 中所有 dist 条目为本地可解析形式

最麻烦的点不是“怎么下包”,而是 Composer 对 dist 和 source 的混合策略:它默认信任 lock 文件里的 dist URL,而这个 URL 在生成时就决定了是否可离线。一旦用了 Packagist 默认源生成的 lock,进隔离网就得全量重刷——没人会记得检查那一行 "url" 字段。

text=ZqhQzanResources