From af2cdcb75256c5779071a05a4ddb96fa1d895299 Mon Sep 17 00:00:00 2001 From: Gabriel Donadel Date: Mon, 29 Jul 2024 04:08:15 -0700 Subject: [PATCH] RNGP - Filter out null dependencies from getGradleDependenciesToApply (#45749) Summary: `getGradleDependenciesToApply` tries to call `implementation:` in all libraries, including the ones that are not supported on Android. ## Changelog: [INTERNAL] [FIXED] - Filter out platform-specific libraries from the auto-linking gradle plugin Pull Request resolved: https://github.com/facebook/react-native/pull/45749 Test Plan: CI should be green Reviewed By: cipolleschi Differential Revision: D60374769 Pulled By: cortinico fbshipit-source-id: 33c83e9cc39d81b0e5c497570a936831ebb345f9 --- .../com/facebook/react/ReactExtension.kt | 28 +++++----- .../com/facebook/react/ReactExtensionTest.kt | 54 ++++++++++++++----- 2 files changed, 58 insertions(+), 24 deletions(-) diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt index 6c925e71110..dcdfc19026d 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt @@ -184,19 +184,23 @@ abstract class ReactExtension @Inject constructor(val project: Project) { internal fun getGradleDependenciesToApply(inputFile: File): MutableList> { val model = JsonUtils.fromAutolinkingConfigJson(inputFile) val result = mutableListOf>() - model?.dependencies?.values?.forEach { deps -> - val nameCleansed = deps.nameCleansed - val dependencyConfiguration = deps.platforms?.android?.dependencyConfiguration - val buildTypes = deps.platforms?.android?.buildTypes ?: emptyList() - if (buildTypes.isEmpty()) { - result.add((dependencyConfiguration ?: "implementation") to ":$nameCleansed") - } else { - buildTypes.forEach { buildType -> - result.add( - (dependencyConfiguration ?: "${buildType}Implementation") to ":$nameCleansed") + model + ?.dependencies + ?.values + ?.filter { it.platforms?.android !== null } + ?.forEach { deps -> + val nameCleansed = deps.nameCleansed + val dependencyConfiguration = deps.platforms?.android?.dependencyConfiguration + val buildTypes = deps.platforms?.android?.buildTypes ?: emptyList() + if (buildTypes.isEmpty()) { + result.add((dependencyConfiguration ?: "implementation") to ":$nameCleansed") + } else { + buildTypes.forEach { buildType -> + result.add( + (dependencyConfiguration ?: "${buildType}Implementation") to ":$nameCleansed") + } + } } - } - } return result } } diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/ReactExtensionTest.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/ReactExtensionTest.kt index 6e40922be3e..d1fcb3d216b 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/ReactExtensionTest.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/ReactExtensionTest.kt @@ -8,8 +8,8 @@ package com.facebook.react import com.facebook.react.ReactExtension.Companion.getGradleDependenciesToApply +import org.assertj.core.api.Assertions.assertThat import org.intellij.lang.annotations.Language -import org.junit.Assert.* import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder @@ -30,7 +30,7 @@ class ReactExtensionTest { .trimIndent()) val deps = getGradleDependenciesToApply(validJsonFile) - assertEquals(0, deps.size) + assertThat(deps).isEmpty() } @Test @@ -57,8 +57,7 @@ class ReactExtensionTest { .trimIndent()) val deps = getGradleDependenciesToApply(validJsonFile) - assertEquals(1, deps.size) - assertTrue("implementation" to ":react-native_oss-library-example" in deps) + assertThat(deps).containsExactly("implementation" to ":react-native_oss-library-example") } @Test @@ -86,8 +85,7 @@ class ReactExtensionTest { .trimIndent()) val deps = getGradleDependenciesToApply(validJsonFile) - assertEquals(1, deps.size) - assertTrue("compileOnly" to ":react-native_oss-library-example" in deps) + assertThat(deps).containsExactly("compileOnly" to ":react-native_oss-library-example") } @Test @@ -115,9 +113,10 @@ class ReactExtensionTest { .trimIndent()) val deps = getGradleDependenciesToApply(validJsonFile) - assertEquals(2, deps.size) - assertTrue("debugImplementation" to ":react-native_oss-library-example" in deps) - assertTrue("releaseImplementation" to ":react-native_oss-library-example" in deps) + assertThat(deps) + .containsExactly( + "debugImplementation" to ":react-native_oss-library-example", + "releaseImplementation" to ":react-native_oss-library-example") } @Test @@ -154,9 +153,40 @@ class ReactExtensionTest { .trimIndent()) val deps = getGradleDependenciesToApply(validJsonFile) - assertEquals(2, deps.size) - assertTrue("implementation" to ":react-native_oss-library-example" in deps) - assertTrue("implementation" to ":react-native_another-library-for-testing" in deps) + assertThat(deps) + .containsExactly( + "implementation" to ":react-native_oss-library-example", + "implementation" to ":react-native_another-library-for-testing") + } + + @Test + fun getGradleDependenciesToApply_withiOSOnlyLibrary_returnsEmptyDepsMap() { + val validJsonFile = + createJsonFile( + """ + { + "reactNativeVersion": "1000.0.0", + "dependencies": { + "@react-native/oss-library-example": { + "root": "./node_modules/@react-native/oss-library-example", + "name": "@react-native/oss-library-example", + "platforms": { + "ios": { + "podspecPath": "./node_modules/@react-native/oss-library-example/oss-library-example.podspec", + "version": "0.0.0", + "configurations": [], + "scriptPhases": [] + }, + "android": null + } + } + } + } + """ + .trimIndent()) + + val deps = getGradleDependenciesToApply(validJsonFile) + assertThat(deps).isEmpty() } private fun createJsonFile(@Language("JSON") input: String) =