react-native 官方乌龙,导致无法正常构建,问题复盘及修复。

872 阅读2分钟

前情提要

今日周一,我按往常启动项目却发现项目构建报错了。本组项目的架构是 Android + RN 混合开发,分属不同仓库。 一开始我以为是构建抽风了,直接重试,继续报错。我又看了代码的 git 记录。本地没做任何变更,却构建失败了。我以为是安卓开发人员那边的问题,问了人家人家也说没做任何改变。 于是我开始审视起报错:

android 项目中 cmd 构建里的错误是:

image.png

image.png

在 Android Studio 中的 build 报错是:

Task :react-native-webview:compileDebugKotlin FAILED: .gradle/caches/transforms-3/231c51da8cb338332869ebcbf20da71c/transformed/jetified-kotlin-stdlib-common-1.6.10.jar!/META-INF/kotlin-stdlib-common.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.1.15.

我寻思我也没改过这个 kotlin 的版本,怎么就不行了。

我把这个错误去百度中搜索,改变几个东西的版本,还是一样的报错。这时安卓开发人员说是不是 RN 项目的问题,于是我把 RN 项目也做 yarn android 构建,同样报错。由此我推断是 RN 的问题。我的代码没有任何变更,所以我推断是 RN 官方的问题。

RN 项目的 cmd 构建报错内容:

image.png 可以明显看到 0.71.0-rc.0 的出现。

官方解释

我进 RN 的 github 仓库中查看 issues ,终于找到官方的问题和解释。 github.com/facebook/re… 简单来说,这个问题的原因是:RN 官方在11月4号发布了 0.71.0-rc0 版本,同时发布了对应的 Maven Central ,老版本的 RN 构建使用的是 + 版本,会去获取 Maven Central 上最新的内容,和本地中的老版本进行比较从而选取最高版本,0.71.0-rc0 版本优先级别更高,导致构建的时候没有按照本地设定的版本,而是走了 0.71.0-rc0 这个版本,产生构建错误。

详细原因

待定,可自行去 issue 上看。

问题修复

官方给了两种修复方式。

  1. 较老版本 react-native (< 0.63) 则需要改代码。

  2. 较新版本 >= 0.63 的话则需要内部更新小版本,升级到以下的版本来解决打包构建失败的问题。

    0.70.5: github.com/facebook/re…

    0.69.7: github.com/facebook/re…

    0.68.5: github.com/facebook/re…

    0.67.5: github.com/facebook/re…

    0.66.5: github.com/facebook/re…

    0.65.3: github.com/facebook/re…

    0.64.4: github.com/facebook/re…

    0.63.5: github.com/facebook/re…

    具体升级的操作不赘述,我这边升级之后能成功打包构建,至此问题解决。

问题总结

由于今天不需要发线上环境的版本,所以影响较小。但是对开发层面还是有影响。不过为了防止后续发生此类构建失败导致无法开发的问题。可以尝试下述方法。

  1. 在每个开发版本中准备一个 debug 包。有了 debug 包能至少保证本地的开发能不受短时间内打包失败的影响。
  2. 在发版前的一段时间先准备一个线上版本的包,如果出现这个问题且短时间内没法解决,能至少不影响上线的发版。