composer怎么在没有网络的情况下使用?

6次阅读

离线安装composer依赖必须提前在联网环境生成composer.lock并下载完整zip包,直接复制vendor目录最可靠;若需后续增删包,须用–repository-url=file://指向本地zip库。

composer怎么在没有网络的情况下使用?

能用,但必须提前准备,不能临时抱佛脚

离线安装前,必须在联网机上生成 composer.lock 并完整下载依赖

没有 composer.lockcomposer install 在离线环境下一定会报错,比如 Could not fetch https://repo.packagist.org/packages.json。它不是“没网就装不了”,而是“没锁文件就根本不敢装”。

  • 在与目标环境一致的联网机器上(PHP 版本、扩展如 mbstringcurl 都要匹配),先确保项目有 composer.json
  • 运行 composer install --no-dev --prefer-dist --optimize-autoloader:强制走 ZIP 包、跳过开发依赖、生成扁平化自动加载器
  • 确认 vendor/ 目录已生成,且 vendor/autoload.php 可被正常 require
  • 务必保留 composer.lock —— 它是离线还原的唯一依据,删了就等于重头联网解析

最简单可靠的方式:直接迁移 vendor/ + autoload.php

这不是“偷懒”,而是对离线场景最务实的选择。只要源环境和目标环境 PHP 兼容性一致,复制过去就能跑。

  • 把整个 vendor/ 目录、composer.lockcomposer.json 一起打包迁移到离线机
  • 入口文件中显式写死路径,比如 require '/opt/myapp/vendor/autoload.php';,避免依赖当前工作目录
  • 如果迁移后类找不到,不要立刻重装,先运行 composer dump-autoload --classmap-authoritative 重建权威类映射
  • 不推荐只复制 vendor/ 后再执行 composer install —— 它仍可能触发插件、脚本或 autoload 重建逻辑,意外发起网络请求

想支持后续增删包?得用 --repository-url=file:// 指向本地 ZIP 包目录

纯复制 vendor/ 适合固定版本部署;若需在离线环境中灵活 require 新包,就得让 Composer 从本地文件系统读取 ZIP。

  • 在联网机上,把 ~/.composer/cache/files/ 下所有 .zip 文件(按 vendor/name/hash.zip 结构)整体拷贝到离线机,例如 /opt/composer-dist/
  • 离线机执行:composer install --no-dev --prefer-dist --repository-url=file:///opt/composer-dist/
  • 该命令会严格按 composer.lock 中记录的 dist.shasum 查找对应 ZIP,校验失败即报错,不会退而求其次
  • 常见失败原因:某个包在 composer.lock 里标记为 "source" 类型(比如用了 dev-mastergit URL),这种没法打包成 ZIP,必须改用稳定版约束

禁用网络不是万能解药,--no-network 有副作用

设置 composer config --global disable-network trueCOMPOSER_DISABLE_NETWORK=1 看似一劳永逸,但容易掩盖真实问题。

  • 它会让所有远程操作静默失败,比如插件初始化、某些 post-install-cmd 脚本、甚至部分 autoload 生成逻辑可能异常退出而不报错
  • 更稳妥的做法是:不设全局禁用,而是在每次安装时显式加 --no-network,并配合 --no-scripts --no-plugins 明确屏蔽非核心行为
  • 如果项目用了私有 Git 仓库,--no-network 会导致 git clone 直接卡死,此时必须提前转为 dist 方式或改用 artifact 仓库类型

真正离线的关键,从来不是命令参数,而是你有没有在联网时把 composer.lock 的每一行、每个 dist.shasum 对应的 ZIP 文件,都实实在在落到硬盘上。漏一个 hash,离线安装就断在那一步,不会提醒你缺什么,只会报“package not found”。

text=ZqhQzanResources