composer如何在受限网络下初始化项目?

4次阅读

composer create-project 国内失败主因是直连 packagist.org 超时,需配置腾讯云/阿里云全链路镜像(如 composer config -g repo.packagist composer https://mirrors.cloud.tencent.com/composer),并注意镜像地址末尾无斜杠;若仍失败,须用 –repository 手动指定模板 zip 地址或改用 git clone + composer install。

composer如何在受限网络下初始化项目?

composer create-project 走不通,因为连不上 packagist.org

国内默认直连 packagist.org 会超时或被重置,create-project 命令卡在“Installing dependencies”前就失败,错误信息通常是 Connection refusedOperation timed out。这不是你本地配置错,是网络策略导致的。

最直接的解法是换镜像源,但注意:不是所有镜像都支持 create-project 的完整流程——有些只代理 composer install 阶段的包下载,不代理项目模板本身的拉取(比如 laravellaravel/laravel)。所以得用支持全链路代理的镜像,目前稳定的是腾讯云和阿里云的 Composer 镜像。

  • 执行前先设全局镜像:composer config -g repo.packagist composer https://mirrors.cloud.tencent.com/composer/
  • 再运行初始化命令,例如:composer create-project laravel/laravel myapp
  • 如果仍失败,加 -vvv 看具体卡在哪一步,大概率是模板仓库(如 laravel/laravel)本身没走镜像——这时要手动指定模板的镜像地址(见下一条)

laravel/laravel 这类模板仓库不走镜像?手动指定 –repository

create-project 默认从 Packagist 解析模板包的元数据,再从其 dist.url 下载 ZIP,这个 URL 是硬编码在 composer.json 里的(比如指向 github),根本绕不开镜像配置。所以即使设了全局镜像,它还是去 GitHub 拉 zip,国内大概率失败。

解决办法是跳过 Packagist 解析,直接告诉 Composer 从镜像站拉 ZIP 包。腾讯云镜像提供 https://mirrors.cloud.tencent.com/composer/p2/ 兼容接口,但需配合 --repository 参数显式指定:

  • 先查模板包在镜像站的真实 ZIP 地址,例如访问:https://mirrors.cloud.tencent.com/composer/p2/laravel/laravel.json,找到最新版的 dist.url(通常是 https://mirrors.cloud.tencent.com/composer/dists/laravel-laravel-10.x.zip
  • 然后用 --repository 指向一个临时 composer.json 文件,里面只定义该包的 ZIP 地址,或者直接用 JSON 字符串(Composer 2.2+ 支持):composer create-project --repository='{"packagist.org":false,"laravel/laravel":{"type":"package","version":"10.48.5","dist":{"url":"https://mirrors.cloud.tencent.com/composer/dists/laravel-laravel-10.x.zip","type":"zip"}}}' laravel/laravel myapp
  • 更稳妥的做法:先用 git clone 拉个空模板(如 git clone https://github.com/laravel/laravel.git myapp),再进目录跑 composer install ——此时镜像配置才真正生效

composer install 卡在 “Loading from cache” 或 “Resolving packages”

这其实是 Composer 在后台默默尝试连接 packagist.org 查询包信息,哪怕你已设镜像,某些版本(尤其是旧版 Composer 1.x)仍会先连原站做校验。现象是长时间无响应,strace 可看到反复 connect 到 151.101.2.133(Fastly IP)。

  • 升级到 Composer 2.5+,镜像兼容性更好,config repo.packagist 能彻底接管元数据请求
  • 确认镜像地址末尾**没有斜杠**:https://mirrors.cloud.tencent.com/composer ✅,https://mirrors.cloud.tencent.com/composer/ ❌(后者会导致 404)
  • 删掉 vendor/composer.lock,重新 composer install,避免缓存残留旧源记录
  • 如果公司有私有 Git 仓库,确保 composer.jsonrepositories 的顺序正确:自定义源放前面,packagist.org: false 放最后

离线环境怎么办?提前打包 vendor + lock 文件

真断网(比如生产服务器完全无外网),靠镜像也没用。这时候必须提前在能联网的机器上把依赖“固化”下来。

核心思路不是复制 vendor/,而是让 composer install 完全不联网——依赖 composer.lock 和本地包缓存(~/.composer/cache)或预下载的 ZIP 包。

  • 在联网机器上,用 composer install --no-dev --prefer-dist 生成完整 composer.lock,并确保所有包都进了缓存(可看 ~/.composer/cache/files/ 下是否有对应 hash 目录)
  • 把整个 ~/.composer/cache 打包,和项目一起拷到离线机;再在离线机上运行:composer install --no-dev --prefer-dist --no-progress
  • 如果连缓存都不能传,就用 composer archive 打包每个依赖(不推荐,太重);更轻量的是用 composer show --tree 列出所有包,写脚本批量 wget 下载 dist ZIP 到本地目录,再通过 repositories 指向该目录

最关键的细节:离线安装时,composer.lock 里的 dist.shasum 必须和你提供的 ZIP 完全一致,否则校验失败直接退出——别手动生成 ZIP,一定要用 Composer 自己下载的那份。

text=ZqhQzanResources