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

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 archive或git 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 install 报 Failed to decode response 或 file_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" 字段。










