You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
4.2 KiB
97 lines
4.2 KiB
import org.apache.tools.ant.taskdefs.condition.Os |
|
|
|
def config = project.hasProperty("react") ? project.react : []; |
|
|
|
def bundleAssetName = config.bundleAssetName ?: "index.android.bundle" |
|
def entryFile = config.entryFile ?: "index.android.js" |
|
|
|
// because elvis operator |
|
def elvisFile(thing) { |
|
return thing ? file(thing) : null; |
|
} |
|
|
|
def reactRoot = elvisFile(config.root) ?: file("../../") |
|
def inputExcludes = config.inputExcludes ?: ["android/**", "ios/**"] |
|
|
|
void runBefore(String dependentTaskName, Task task) { |
|
Task dependentTask = tasks.findByPath(dependentTaskName); |
|
if (dependentTask != null) { |
|
dependentTask.dependsOn task |
|
} |
|
} |
|
|
|
gradle.projectsEvaluated { |
|
// Grab all build types and product flavors |
|
def buildTypes = android.buildTypes.collect { type -> type.name } |
|
def productFlavors = android.productFlavors.collect { flavor -> flavor.name } |
|
|
|
// When no product flavors defined, use empty |
|
if (!productFlavors) productFlavors.add('') |
|
|
|
productFlavors.each { productFlavorName -> |
|
buildTypes.each { buildTypeName -> |
|
// Create variant and target names |
|
def targetName = "${productFlavorName.capitalize()}${buildTypeName.capitalize()}" |
|
def targetPath = productFlavorName ? |
|
"${productFlavorName}/${buildTypeName}" : |
|
"${buildTypeName}" |
|
|
|
// React js bundle directories |
|
def jsBundleDirConfigName = "jsBundleDir${targetName}" |
|
def jsBundleDir = elvisFile(config."$jsBundleDirConfigName") ?: |
|
file("$buildDir/intermediates/assets/${targetPath}") |
|
|
|
def resourcesDirConfigName = "jsBundleDir${targetName}" |
|
def resourcesDir = elvisFile(config."${resourcesDirConfigName}") ?: |
|
file("$buildDir/intermediates/res/merged/${targetPath}") |
|
def jsBundleFile = file("$jsBundleDir/$bundleAssetName") |
|
|
|
// Bundle task name for variant |
|
def bundleJsAndAssetsTaskName = "bundle${targetName}JsAndAssets" |
|
|
|
def currentBundleTask = tasks.create( |
|
name: bundleJsAndAssetsTaskName, |
|
type: Exec) { |
|
group = "react" |
|
description = "bundle JS and assets for ${targetName}." |
|
|
|
// Create dirs if they are not there (e.g. the "clean" task just ran) |
|
doFirst { |
|
jsBundleDir.mkdirs() |
|
resourcesDir.mkdirs() |
|
} |
|
|
|
// Set up inputs and outputs so gradle can cache the result |
|
inputs.files fileTree(dir: reactRoot, excludes: inputExcludes) |
|
outputs.dir jsBundleDir |
|
outputs.dir resourcesDir |
|
|
|
// Set up the call to the react-native cli |
|
workingDir reactRoot |
|
|
|
// Set up dev mode |
|
def devEnabled = !targetName.toLowerCase().contains("release") |
|
if (Os.isFamily(Os.FAMILY_WINDOWS)) { |
|
commandLine "cmd", "/c", "react-native", "bundle", "--platform", "android", "--dev", "${devEnabled}", |
|
"--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir |
|
} else { |
|
commandLine "react-native", "bundle", "--platform", "android", "--dev", "${devEnabled}", |
|
"--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir |
|
} |
|
|
|
enabled config."bundleIn${targetName}" || |
|
config."bundleIn${buildTypeName.capitalize()}" ?: |
|
targetName.toLowerCase().contains("release") |
|
} |
|
|
|
// Hook bundle${productFlavor}${buildType}JsAndAssets into the android build process |
|
currentBundleTask.dependsOn("merge${targetName}Resources") |
|
currentBundleTask.dependsOn("merge${targetName}Assets") |
|
|
|
runBefore("processArmeabi-v7a${targetName}Resources", currentBundleTask) |
|
runBefore("processX86${targetName}Resources", currentBundleTask) |
|
runBefore("processUniversal${targetName}Resources", currentBundleTask) |
|
runBefore("process${targetName}Resources", currentBundleTask) |
|
} |
|
} |
|
}
|
|
|