Skip to content

Commit 54c2d2a

Browse files
hurali97thymikee
andauthored
fix: remove cyclic dependency between tasks (#133)
* fix: remove cyclic dependency between tasks * refactor: move task dependency for JSBubndle to variant aware preBuild task * refator: extract copySoLibsTask to a function * feat: add dynamicLibs * empty --------- Co-authored-by: Michał Pierzchała <[email protected]>
1 parent e7d3530 commit 54c2d2a

File tree

3 files changed

+54
-28
lines changed

3 files changed

+54
-28
lines changed

gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/plugin/RNSourceSets.kt

Lines changed: 13 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ object RNSourceSets {
9696
}
9797

9898
private fun configureTasks() {
99-
val projectName = project.name
10099
val appProjectName = appProject.name
101100

102101
project.tasks.register("copyAutolinkingSources", Copy::class.java) {
@@ -108,33 +107,19 @@ object RNSourceSets {
108107
patchRNEntryPoint(it, path)
109108
}
110109

111-
androidExtension.buildTypes.forEach { buildType ->
112-
val capitalisedBuildType = buildType.name.replaceFirstChar { it.titlecase() }
113-
val codegenTaskName = "generateCodegenSchemaFromJavaScript"
114-
val strippedNativeLibsPath = "$appBuildDir/intermediates/stripped_native_libs"
115-
val strippedDebugSymbolsPath = "strip${capitalisedBuildType}DebugSymbols/out/lib"
116-
117-
val copyLibTask =
118-
project.tasks.register("copy${capitalisedBuildType}LibSources", Copy::class.java) {
119-
it.dependsOn(":$appProjectName:$codegenTaskName")
120-
it.dependsOn(":$appProjectName:strip${capitalisedBuildType}DebugSymbols")
121-
it.dependsOn(":$projectName:$codegenTaskName")
122-
123-
it.from(
124-
"$strippedNativeLibsPath/${buildType.name}/$strippedDebugSymbolsPath",
125-
)
126-
it.into(project.rootProject.file("$projectName/libs$capitalisedBuildType"))
127-
it.include("**/libappmodules.so", "**/libreact_codegen_*.so")
128-
extension.dynamicLibs.forEach { lib -> it.include("**/$lib") }
129-
}
130-
131-
project.tasks.named("preBuild").configure {
132-
it.dependsOn("copyAutolinkingSources")
133-
it.dependsOn(copyLibTask)
134-
if (capitalisedBuildType == "Release") {
135-
it.dependsOn(":${appProject.name}:createBundleReleaseJsAndAssets")
136-
}
137-
}
110+
project.tasks.named("preBuild").configure {
111+
/**
112+
* Ensure auto-generated sources are available before compilation.
113+
*
114+
* This hooks into the global `preBuild` task, so the dependency runs
115+
* regardless of build variant. Use this only when the generated sources
116+
* are identical for all variants (debug/release).
117+
*
118+
* If variant-specific
119+
* files are needed, prefer `preDebugBuild` / `preReleaseBuild` under
120+
* `VariantProcessor.processVariant`
121+
*/
122+
it.dependsOn("copyAutolinkingSources")
138123
}
139124
}
140125
}

gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/processors/JNILibsProcessor.kt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ import com.callstack.react.brownfield.exceptions.TaskNotFound
1616
import com.callstack.react.brownfield.shared.BaseProject
1717
import com.callstack.react.brownfield.shared.Logging
1818
import com.callstack.react.brownfield.utils.AndroidArchiveLibrary
19+
import com.callstack.react.brownfield.utils.Extension
1920
import org.gradle.api.Task
21+
import org.gradle.api.tasks.Copy
22+
import org.gradle.api.tasks.TaskProvider
2023
import java.io.File
2124

2225
class JNILibsProcessor : BaseProject() {
@@ -34,8 +37,11 @@ class JNILibsProcessor : BaseProject() {
3437
}
3538

3639
val androidExtension = project.extensions.getByName("android") as LibraryExtension
40+
val copyTask = copySoLibsTask(variant)
41+
3742
mergeJniLibsTask.configure {
3843
it.dependsOn(explodeTasks)
44+
it.dependsOn(copyTask)
3945

4046
it.doFirst {
4147
for (archiveLibrary in aarLibraries) {
@@ -50,6 +56,36 @@ class JNILibsProcessor : BaseProject() {
5056
}
5157
}
5258

59+
private fun copySoLibsTask(variant: LibraryVariant): TaskProvider<Copy> {
60+
val variantName = variant.name
61+
val capitalizedVariant = variantName.replaceFirstChar(Char::titlecase)
62+
63+
val projectExt = project.extensions.getByType(Extension::class.java)
64+
val appProject = project.rootProject.project(projectExt.appProjectName)
65+
val appBuildDir = appProject.layout.buildDirectory.get()
66+
67+
val stripTask = ":${appProject.name}:strip${capitalizedVariant}DebugSymbols"
68+
val codegenTask = ":${project.name}:generateCodegenSchemaFromJavaScript"
69+
70+
val fromDir =
71+
appBuildDir
72+
.dir("intermediates/stripped_native_libs/$variantName/strip${capitalizedVariant}DebugSymbols/out/lib")
73+
.asFile
74+
75+
val intoDir =
76+
project.rootProject
77+
.file("${project.name}/libs$capitalizedVariant")
78+
79+
return project.tasks.register("copy${capitalizedVariant}LibSources", Copy::class.java) {
80+
it.dependsOn(stripTask, codegenTask)
81+
it.from(fromDir)
82+
it.into(intoDir)
83+
84+
it.include("**/libappmodules.so", "**/libreact_codegen_*.so")
85+
projectExt.dynamicLibs.forEach { lib -> it.include("**/$lib") }
86+
}
87+
}
88+
5389
private fun processNestedLibs(files: Array<File>?) {
5490
val existingJNILibs =
5591
listOf("arm64-v8a", "armeabi-v7a", "x86_64", "x86")

gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/processors/VariantProcessor.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
package com.callstack.react.brownfield.processors
1212

1313
import com.android.build.gradle.api.LibraryVariant
14+
import com.android.build.gradle.internal.tasks.factory.dependsOn
1415
import com.callstack.react.brownfield.artifacts.ArtifactsResolver.Companion.ARTIFACT_TYPE_AAR
1516
import com.callstack.react.brownfield.artifacts.ArtifactsResolver.Companion.ARTIFACT_TYPE_JAR
1617
import com.callstack.react.brownfield.exceptions.TaskNotFound
@@ -54,6 +55,10 @@ class VariantProcessor(private val variant: LibraryVariant) : BaseProject() {
5455
throw TaskNotFound("Can not find $preBuildTaskPath task")
5556
}
5657

58+
if (upperCaseVariantName == "Release") {
59+
prepareTask.dependsOn(":app:createBundleReleaseJsAndAssets")
60+
}
61+
5762
val bundleTask = variantTaskProvider.bundleTaskProvider(project, variant.name)
5863
explodeArtifactFiles(artifacts, prepareTask, bundleTask)
5964
mergeClassesAndJars(bundleTask)

0 commit comments

Comments
 (0)