Skip to content

Commit 615d9ae

Browse files
douglowderfacebook-github-bot
authored andcommitted
Read Maven group from GROUP property (#37204)
Summary: The [React Native TV repo](https://github.com/react-native-tvos/react-native-tvos) shares most of the same Android code as the core repo. Beginning in 0.71, it needs to also publish Android Maven artifacts for the `react-android` and `hermes-android` libraries. In order to avoid conflicts, it needs to publish the artifacts to a different group name. However, `react-native-gradle-plugin` uses a hardcoded group name (`com.facebook.react`). Solution: read the group name from the existing `GROUP` property in `ReactAndroid/gradle.properties`. ## Changelog: [Android] [Fixed] - read GROUP name in gradle-plugin dependency code Pull Request resolved: #37204 Test Plan: - Android unit tests have been added for the new code and new method in `DependencyUtils.kt`. - Existing tests should pass - The new code defaults to the correct group (`com.facebook.react`) so no functional change is expected in the core repo. Reviewed By: luluwu2032 Differential Revision: D45576700 Pulled By: cortinico fbshipit-source-id: 6297ab515b4bdbb17024989c7d3035b0a2ded0ae
1 parent ef69c54 commit 615d9ae

File tree

3 files changed

+83
-20
lines changed

3 files changed

+83
-20
lines changed

packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import com.facebook.react.utils.AgpConfiguratorUtils.configureDevPorts
1818
import com.facebook.react.utils.BackwardCompatUtils.configureBackwardCompatibilityReactMap
1919
import com.facebook.react.utils.DependencyUtils.configureDependencies
2020
import com.facebook.react.utils.DependencyUtils.configureRepositories
21-
import com.facebook.react.utils.DependencyUtils.readVersionString
21+
import com.facebook.react.utils.DependencyUtils.readVersionAndGroupStrings
2222
import com.facebook.react.utils.JdkConfiguratorUtils.configureJavaToolChains
2323
import com.facebook.react.utils.JsonUtils
2424
import com.facebook.react.utils.NdkConfiguratorUtils.configureReactNativeNdk
@@ -55,8 +55,10 @@ class ReactPlugin : Plugin<Project> {
5555
project.afterEvaluate {
5656
val reactNativeDir = extension.reactNativeDir.get().asFile
5757
val propertiesFile = File(reactNativeDir, "ReactAndroid/gradle.properties")
58-
val versionString = readVersionString(propertiesFile)
59-
configureDependencies(project, versionString)
58+
val versionAndGroupStrings = readVersionAndGroupStrings(propertiesFile)
59+
val versionString = versionAndGroupStrings.first
60+
val groupString = versionAndGroupStrings.second
61+
configureDependencies(project, versionString, groupString)
6062
configureRepositories(project, reactNativeDir)
6163
}
6264

packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/DependencyUtils.kt

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import java.util.*
1313
import org.gradle.api.Project
1414
import org.gradle.api.artifacts.repositories.MavenArtifactRepository
1515

16+
internal const val DEFAULT_GROUP_STRING = "com.facebook.react"
17+
1618
internal object DependencyUtils {
1719

1820
/**
@@ -46,7 +48,11 @@ internal object DependencyUtils {
4648
* - Forcing the react-android/hermes-android version to the one specified in the package.json
4749
* - Substituting `react-native` with `react-android` and `hermes-engine` with `hermes-android`.
4850
*/
49-
fun configureDependencies(project: Project, versionString: String) {
51+
fun configureDependencies(
52+
project: Project,
53+
versionString: String,
54+
groupString: String = DEFAULT_GROUP_STRING
55+
) {
5056
if (versionString.isBlank()) return
5157
project.rootProject.allprojects { eachProject ->
5258
eachProject.configurations.all { configuration ->
@@ -56,32 +62,36 @@ internal object DependencyUtils {
5662
// implementation("com.facebook.react:react-native:+") and resolve the right dependency.
5763
configuration.resolutionStrategy.dependencySubstitution {
5864
it.substitute(it.module("com.facebook.react:react-native"))
59-
.using(it.module("com.facebook.react:react-android:${versionString}"))
65+
.using(it.module("${groupString}:react-android:${versionString}"))
6066
.because(
6167
"The react-native artifact was deprecated in favor of react-android due to https://github.com/facebook/react-native/issues/35210.")
6268
it.substitute(it.module("com.facebook.react:hermes-engine"))
63-
.using(it.module("com.facebook.react:hermes-android:${versionString}"))
69+
.using(it.module("${groupString}:hermes-android:${versionString}"))
6470
.because(
6571
"The hermes-engine artifact was deprecated in favor of hermes-android due to https://github.com/facebook/react-native/issues/35210.")
6672
}
6773
configuration.resolutionStrategy.force(
68-
"com.facebook.react:react-android:${versionString}",
69-
"com.facebook.react:hermes-android:${versionString}",
74+
"${groupString}:react-android:${versionString}",
75+
"${groupString}:hermes-android:${versionString}",
7076
)
7177
}
7278
}
7379
}
7480

75-
fun readVersionString(propertiesFile: File): String {
81+
fun readVersionAndGroupStrings(propertiesFile: File): Pair<String, String> {
7682
val reactAndroidProperties = Properties()
7783
propertiesFile.inputStream().use { reactAndroidProperties.load(it) }
78-
val versionString = reactAndroidProperties["VERSION_NAME"] as? String ?: ""
84+
val versionStringFromFile = reactAndroidProperties["VERSION_NAME"] as? String ?: ""
7985
// If on a nightly, we need to fetch the -SNAPSHOT artifact from Sonatype.
80-
return if (versionString.startsWith("0.0.0")) {
81-
"$versionString-SNAPSHOT"
82-
} else {
83-
versionString
84-
}
86+
val versionString =
87+
if (versionStringFromFile.startsWith("0.0.0")) {
88+
"$versionStringFromFile-SNAPSHOT"
89+
} else {
90+
versionStringFromFile
91+
}
92+
// Returns Maven group for repos using different group for Maven artifacts
93+
val groupString = reactAndroidProperties["GROUP"] as? String ?: DEFAULT_GROUP_STRING
94+
return Pair(versionString, groupString)
8595
}
8696

8797
fun Project.mavenRepoFromUrl(url: String): MavenArtifactRepository =

packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/DependencyUtilsTest.kt

Lines changed: 56 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import com.facebook.react.utils.DependencyUtils.configureDependencies
1212
import com.facebook.react.utils.DependencyUtils.configureRepositories
1313
import com.facebook.react.utils.DependencyUtils.mavenRepoFromURI
1414
import com.facebook.react.utils.DependencyUtils.mavenRepoFromUrl
15-
import com.facebook.react.utils.DependencyUtils.readVersionString
15+
import com.facebook.react.utils.DependencyUtils.readVersionAndGroupStrings
1616
import java.net.URI
1717
import org.gradle.api.artifacts.repositories.MavenArtifactRepository
1818
import org.gradle.testfixtures.ProjectBuilder
@@ -226,6 +226,24 @@ class DependencyUtilsTest {
226226
assertTrue(libForcedModules.any { it.toString() == "com.facebook.react:hermes-android:1.2.3" })
227227
}
228228

229+
@Test
230+
fun configureDependencies_withVersionStringAndGroupString_appliesOnAllProjects() {
231+
val rootProject = ProjectBuilder.builder().build()
232+
val appProject = ProjectBuilder.builder().withName("app").withParent(rootProject).build()
233+
val libProject = ProjectBuilder.builder().withName("lib").withParent(rootProject).build()
234+
appProject.plugins.apply("com.android.application")
235+
libProject.plugins.apply("com.android.library")
236+
237+
configureDependencies(appProject, "1.2.3", "io.github.test")
238+
239+
val appForcedModules = appProject.configurations.first().resolutionStrategy.forcedModules
240+
val libForcedModules = libProject.configurations.first().resolutionStrategy.forcedModules
241+
assertTrue(appForcedModules.any { it.toString() == "io.github.test:react-android:1.2.3" })
242+
assertTrue(appForcedModules.any { it.toString() == "io.github.test:hermes-android:1.2.3" })
243+
assertTrue(libForcedModules.any { it.toString() == "io.github.test:react-android:1.2.3" })
244+
assertTrue(libForcedModules.any { it.toString() == "io.github.test:hermes-android:1.2.3" })
245+
}
246+
229247
@Test
230248
fun readVersionString_withCorrectVersionString_returnsIt() {
231249
val propertiesFile =
@@ -238,7 +256,7 @@ class DependencyUtilsTest {
238256
.trimIndent())
239257
}
240258

241-
val versionString = readVersionString(propertiesFile)
259+
val versionString = readVersionAndGroupStrings(propertiesFile).first
242260

243261
assertEquals("1000.0.0", versionString)
244262
}
@@ -255,7 +273,7 @@ class DependencyUtilsTest {
255273
.trimIndent())
256274
}
257275

258-
val versionString = readVersionString(propertiesFile)
276+
val versionString = readVersionAndGroupStrings(propertiesFile).first
259277

260278
assertEquals("0.0.0-20221101-2019-cfe811ab1-SNAPSHOT", versionString)
261279
}
@@ -271,7 +289,7 @@ class DependencyUtilsTest {
271289
.trimIndent())
272290
}
273291

274-
val versionString = readVersionString(propertiesFile)
292+
val versionString = readVersionAndGroupStrings(propertiesFile).first
275293
assertEquals("", versionString)
276294
}
277295

@@ -287,10 +305,43 @@ class DependencyUtilsTest {
287305
.trimIndent())
288306
}
289307

290-
val versionString = readVersionString(propertiesFile)
308+
val versionString = readVersionAndGroupStrings(propertiesFile).first
291309
assertEquals("", versionString)
292310
}
293311

312+
@Test
313+
fun readGroupString_withCorrectGroupString_returnsIt() {
314+
val propertiesFile =
315+
tempFolder.newFile("gradle.properties").apply {
316+
writeText(
317+
"""
318+
GROUP=io.github.test
319+
ANOTHER_PROPERTY=true
320+
"""
321+
.trimIndent())
322+
}
323+
324+
val groupString = readVersionAndGroupStrings(propertiesFile).second
325+
326+
assertEquals("io.github.test", groupString)
327+
}
328+
329+
@Test
330+
fun readGroupString_withEmptyGroupString_returnsDefault() {
331+
val propertiesFile =
332+
tempFolder.newFile("gradle.properties").apply {
333+
writeText(
334+
"""
335+
ANOTHER_PROPERTY=true
336+
"""
337+
.trimIndent())
338+
}
339+
340+
val groupString = readVersionAndGroupStrings(propertiesFile).second
341+
342+
assertEquals("com.facebook.react", groupString)
343+
}
344+
294345
@Test
295346
fun mavenRepoFromUrl_worksCorrectly() {
296347
val process = createProject()

0 commit comments

Comments
 (0)