Compare commits

...
2 changed files with 19 additions and 10 deletions
@@ -158,14 +158,16 @@ abstract class ReactExtension @Inject constructor(val project: Project) {
* This function will read the autolinking configuration file and add Gradle dependencies to the
* app. This function should be invoked inside the react {} block in the app's build.gradle and is
* necessary for libraries to be linked correctly.
*
* @param method The method to use for linking dependencies. By default, it is `implementation`.
*/
fun autolinkLibrariesWithApp() {
fun autolinkLibrariesWithApp(method: String? = "implementation") {
val inputFile =
project.rootProject.layout.buildDirectory
.file("generated/autolinking/autolinking.json")
.get()
.asFile
val dependenciesToApply = getGradleDependenciesToApply(inputFile)
val dependenciesToApply = getGradleDependenciesToApply(inputFile, method ?: "implementation")
dependenciesToApply.forEach { (configuration, path) ->
project.dependencies.add(configuration, project.dependencies.project(mapOf("path" to path)))
}
@@ -179,9 +181,10 @@ abstract class ReactExtension @Inject constructor(val project: Project) {
* They will be applied to the Gradle project for linking the libraries.
*
* @param inputFile The file to read the autolinking configuration from.
* @param method The method to use for linking dependencies. By default, it is `implementation`.
* @return A list of Gradle Configuration <-> Project name pairs.
*/
internal fun getGradleDependenciesToApply(inputFile: File): MutableList<Pair<String, String>> {
internal fun getGradleDependenciesToApply(inputFile: File, method: String = "implementation"): MutableList<Pair<String, String>> {
val model = JsonUtils.fromAutolinkingConfigJson(inputFile)
val result = mutableListOf<Pair<String, String>>()
model
@@ -194,11 +197,11 @@ abstract class ReactExtension @Inject constructor(val project: Project) {
val dependencyConfiguration = deps.platforms?.android?.dependencyConfiguration
val buildTypes = deps.platforms?.android?.buildTypes ?: emptyList()
if (buildTypes.isEmpty()) {
result.add((dependencyConfiguration ?: "implementation") to ":$nameCleansed")
result.add((dependencyConfiguration ?: method) to ":$nameCleansed")
} else {
buildTypes.forEach { buildType ->
result.add(
(dependencyConfiguration ?: "${buildType}Implementation") to ":$nameCleansed")
(dependencyConfiguration ?: "${buildType}${method.replaceFirstChar(Char::titlecase)}") to ":$nameCleansed")
}
}
}
@@ -81,7 +81,7 @@ class ReactPlugin : Plugin<Project> {
project.configureReactTasks(variant = variant, config = extension)
}
}
configureAutolinking(project, extension)
configureAutolinking(project, extension, isLibrary = false)
configureCodegen(project, extension, rootExtension, isLibrary = false)
}
@@ -89,6 +89,7 @@ class ReactPlugin : Plugin<Project> {
configureBuildConfigFieldsForLibraries(project)
configureNamespaceForLibraries(project)
project.pluginManager.withPlugin("com.android.library") {
configureAutolinking(project, extension, isLibrary = true)
configureCodegen(project, extension, rootExtension, isLibrary = true)
}
}
@@ -218,6 +219,7 @@ class ReactPlugin : Plugin<Project> {
private fun configureAutolinking(
project: Project,
extension: ReactExtension,
isLibrary: Boolean
) {
val generatedAutolinkingJavaDir: Provider<Directory> =
project.layout.buildDirectory.dir("generated/autolinking/src/main/java")
@@ -258,11 +260,15 @@ class ReactPlugin : Plugin<Project> {
project.tasks.named("preBuild", Task::class.java).dependsOn(generatePackageListTask)
// We tell Android Gradle Plugin that inside /build/generated/autolinking/src/main/java there
// are sources to be compiled as well.
project.extensions.getByType(AndroidComponentsExtension::class.java).apply {
onVariants(selector().all()) { variant ->
variant.sources.java?.addStaticSourceDirectory(
// are sources to be compiled as well. We only compile this code if project is not a library.
// Without this, the compiler will link the generated files to each of the library including
// the ones from OSS, which is not expected.
if (!isLibrary) {
project.extensions.getByType(AndroidComponentsExtension::class.java).apply {
onVariants(selector().all()) { variant ->
variant.sources.java?.addStaticSourceDirectory(
generatedAutolinkingJavaDir.get().asFile.absolutePath)
}
}
}
}