composer如何在断网状态下运行install?

5次阅读

断网时应使用 composer install –no-network 命令,前提是已有完整 vendor/ 和兼容的 composer.lock;该参数强制跳过所有远程请求,依赖本地缓存和 tarball 分发包。

composer如何在断网状态下运行install?

断网时 composer install 报错 “Could not resolve host” 怎么办

根本原因不是命令本身有问题,而是 Composer 默认每次运行都会连 packagist.org 检查包元数据、更新锁文件或验证版本约束。断网时 DNS 解析失败,直接卡在 composer install 第一步。

关键前提是:你已有完整的 vendor/ 和有效的 composer.lock(即之前联网成功执行过 composer installcomposer update)。

  • --no-interaction--no-plugins 不能解决网络问题,只是跳过交互和插件加载
  • 真正起作用的是 --no-scripts--no-progress —— 它们不解决联网,但能减少失败路径;核心还是得让 Composer 别去联网
  • 必须确保 composer.lock 是最新且与 composer.json 兼容的,否则即使断网也会报 Your lock file does not contain a compatible set of packages

--no-network 强制跳过所有远程请求

这是 Composer 2.2+ 内置的开关,专为离线场景设计。它会禁用所有 http 请求:不查 packagist、不验签名、不拉 dist source、不触发 repo 插件钩子。

注意:--no-network 不是“降级模式”,而是一个硬性拦截——只要代码里有 RepositoryManager::fetchPackage() 这类调用,就会被短路返回本地缓存或抛出明确异常(如 Package not found in local cache)。

  • 只对 installupdate 生效,requireremove 仍会尝试联网(因需解析新依赖)
  • 若项目用了私有 repo(比如 type: composer 的内网源),该源的包必须已存在于 ~/.composer/cache/ 或项目 vendor/ 中,否则照样失败
  • 执行前确认 composer.lock 里每个包的 dist.url 字段指向的是 tarball 路径(非 git 链接),否则 --no-network 无法 fallback 到本地归档

正确用法:

composer install --no-network

为什么 composer install 断网后有时仍能跑,有时立刻报错

行为差异取决于 composer.lock 的生成方式和当前 Composer 版本。Composer 1.x 默认走 packagist.org API,哪怕只校验 hash;Composer 2.2+ 在检测到 composer.lock 完整时,会优先读取本地 vendor/composer/installed.json 做快速比对。

  • 如果上次 install 是用 --prefer-dist(默认),且所有包都以 tarball 形式下载并解压,断网后成功率高
  • 如果含 "source": {...} 类型的包(比如 dev-main 分支),Composer 会试图 clone git,断网必挂,除非提前用 git archive 手动塞进缓存
  • 某些插件(如 hirak/prestissimo)已废弃,但若残留配置,可能在初始化阶段触发 DNS 查询,导致 --no-network 失效

本地缓存没清干净,--no-network 也救不了的情况

Composer 缓存分两层:全局 ~/.composer/cache/(含 zip/tar 包)和项目级 vendor/(含 autoload、installed.json)。断网时,前者缺失会导致 dist 包无法还原,后者损坏则连 autoloader 都构建失败。

  • 检查缓存是否完整:
    composer show --all | head -5

    如果报 Failed to initialize global composer: file could not be loaded,说明全局配置或缓存目录权限异常

  • 手动补缓存:把另一台机器上 ~/.composer/cache/files/ 下对应包的 zip 文件,按 vendor/name/hash.zip 路径复制过来
  • 最稳的离线方案其实是提前运行:
    composer install --no-dev --prefer-dist --no-scripts && composer archive --format=zip --file=offline-bundle.zip

    然后在目标机解压覆盖 vendor/,绕过 Composer 所有逻辑

离线不是单纯加个 flag 就行的事,本质是控制「哪些信息必须来自网络」「哪些可以固化」。很多人卡在 --no-network 不生效,其实是因为 composer.lock 里混了 git source,或者缓存目录被误删了一半。

text=ZqhQzanResources