由于发布了React Native 0.71.0-rc.0版本,在过去的几天里,React Native Android构建失败,出现了不同的错误,而代码没有任何变化。
注意:错误可能是不同的,但如果你在过去两天内没有对代码进行任何修改的情况下进行安卓构建时,会得到任何错误。
我的错误 - 安装应用程序失败。Error: Command failed: ./gradlew app:installDebug -PreactNativeDevServerPort=8081
error Failed to install the app. Make sure you have the Android development environment set up:
Error: Command failed: ./gradlew app:installDebug
-PreactNativeDevServerPort=8081
FAILURE: Build failed with an exception.
* Where: Build file '/Users/....../node_modules/react-native-month-year-picker/android/build.gradle' line: 115
* What went wrong: A problem occurred configuring project ':react-native-month-year-picker'.
> Could not resolve all files for configuration ':react-native-month-year-picker:implementation'.
> Could not resolve com.facebook.react:react-native:+.
Required by:
project :react-native-month-year-picker
> Cannot choose between the following variants of com.facebook.react:react-native:0.71.0-rc.0:
- debugVariantDefaultRuntimePublication
- releaseVariantDefaultRuntimePublication
All of them match the consumer attributes:
- Variant 'debugVariantDefaultRuntimePublication' capability com.facebook.react:react-native:0.71.0-rc.0:
安卓系统的构建失败是由于React Native版本的发布0.71.0-rc0
造成的。
注意:错误可能是不同的,但如果你在过去两天里没有对代码进行任何修改,就会出现安卓构建失败的情况,这将是一个解决方案。
在尝试这些方法之前,请恢复你所做的每一个改动:https://stackoverflow.com/a/74371195/10657559。
办法一
在你的android -> build.gradle文件中添加这个修正,如下所示。
buildscript {
// ...
}
allprojects {
repositories {
exclusiveContent {
filter {
includeGroup "com.facebook.react"
}
forRepository {
maven {
url "$rootDir/../node_modules/react-native/android"
}
}
}
// ...
}
}
这个修正所要做的是应用一个exclusiveContent
的解析规则,强制解析React Native Android库,以使用node_modules
里面的那个库。
办法二
如果你的gradle不支持上述内容,那么就把这个添加到你的android -> build.gradle文件中,如下所示。
def REACT_NATIVE_VERSION = new File(['node', '--print',"JSON.parse(require('fs').readFileSync(require.resolve('react-native/package.json'), 'utf-8')).version"].execute(null, rootDir).text.trim())
buildscript {
// ...
}
allprojects {
configurations.all {
resolutionStrategy {
force "com.facebook.react:react-native:" + REACT_NATIVE_VERSION
}
}
// ...
}
Ref: Fix and updates on Android build failures happening since Nov 4th 2022 #35210
implementation "com.facebook.react:react-native:+"
末尾的 +
造成的吗?在android/app/build.gradle
- Mathias Bradiceanu 2022-11-06
build.gradle
文件中的compileSdkVersion
改为31
.....如果不成功的话,请恢复修改,将react-native
降级为0.66.3
,这在以前是可以正常工作的,并应用这里提到的解决方案,再试一下。
- ZFloc Technologies 2022-11-08
在已投票的答案基础上补充,做一些知识分享。
重申一下,正如@Thanhal所发布的,解决方案和官方解释可以在这里找到。Android build failures No matching variant of com.facebook.react:react-native:0.71.0-rc.0 was found.
错误发生后,我需要回答的最大问题是:
在package.json中指定了我的react-native版本后,为什么我的项目还是会下载另一个react-native版本呢?
我甚至用npm install --save-exact
来确保我得到的是正确的版本。
我得到的错误信息让我更加迷惑不解:
The class is loaded from ~/.gradle/caches/transforms-3/9a8c596b7e1788d5bad7c80991eefff1/transformed/jetified-kotlin-stdlib-1.6.10.jar!/kotlin/Unit.class e: .../node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/permissions/PermissionsService.kt: (351, 32): Class 'kotlin.Unit' was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.4.1.
不知何故,Kotlin对我来说也成了一个问题。
谁/什么人在要求最新的react-native?
对于我来说,这里的问题不是关于我的项目所使用的 react-native 的版本。它是关于我的库所使用的东西。
直到0.71.0-rc.0
,react-native团队一直在NPM包(node_modules/react-native/android/)中提供一个Maven仓库。大多数库的build.gradle都被配置为引用这个目录。这是通过在libraries build.gradle中声明一个自定义仓库完成的。
maven {
url "$rootDir/../node_modules/react-native/android"
}
但在库的build.gradle文件中,声明了更多的存储库,可能会是这样的:
repositories {
maven {
url "$rootDir/../node_modules/react-native/android"
}
google()
mavenLocal()
mavenCentral()
}
然后,该库的依赖性被如此声明:
dependencies {
implementation 'com.facebook.react:react-native:+'
}
因为"+"作为 react-native 依赖关系的版本,Gradle 会从各种声明的仓库中获取最新的 react-native 版本。
由于过去react-native是与npm包一起发布的,所以Gradle总是将react-native放在node_modules
。然而,现在react-native团队将库发布到包括MavenCentral在内的公共仓库,Gradle会尊重"+",而采用MavenCentral上的版本。
为什么我得到了Kotlin的错误?
我的项目使用的是 react-native 的旧版本,从 0.68 版开始, react-native 开始使用 Kotlin 1.6.10 版本(查看更改历史)。所以是的,react-native版本的差异也会导致Kotlin错误。
Facebook已经发布了>=0.63的错误修复版本。你也可以升级而不是应用热修复。
这个修复方法是有效的。
失败的原因:Android的构建失败是由于向Maven发布了0.71.0-rc0版本的React Native,因此当gradle同步时,它选择了0.71.0-rc0版本的react-native,而不是你当前版本的react-native。
在没有升级react-native版本的情况下,通过在build.gradle中添加这个,这就可以了(无论是否启用hermes,连同flipper也是如此)。
exclusiveContent {
// We get React Native's Android binaries exclusively through npm,
// from a local Maven repo inside node_modules/react-native/.
// (The use of exclusiveContent prevents looking elsewhere like Maven Central
// and potentially getting a wrong version.)
filter {
includeGroup "com.facebook.react"
}
forRepository {
maven {
url "$rootDir/../node_modules/react-native/android"
}
}
}
最后的片段看起来是这样的
allprojects {
repositories {
exclusiveContent {
// We get React Native's Android binaries exclusively through npm,
// from a local Maven repo inside node_modules/react-native/.
// (The use of exclusiveContent prevents looking elsewhere like Maven Central
// and potentially getting a wrong version.)
filter {
includeGroup "com.facebook.react"
}
forRepository {
maven {
url "$rootDir/../node_modules/react-native/android"
}
}
}
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url("$rootDir/../node_modules/react-native/android")
在此修复后,gradle clean 并重建。然后你就可以成功地在本地运行react native的安卓系统。
这个修正所要做的是应用一个exclusiveContent
的解析规则,强制解析React Native Android库,以使用node_modules
里面的解析规则。
现在。
不同版本的react native有一些补丁版本,如果你不想进行此修复
,你可以将你当前的react native版本更新到这里提到的react native补丁版本上。