2015-11-18 20:17:39 +00:00
|
|
|
import org.apache.tools.ant.taskdefs.condition.Os
|
|
|
|
|
2015-10-19 13:32:02 +00:00
|
|
|
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/**"]
|
|
|
|
|
2016-01-07 17:32:46 +00:00
|
|
|
void runBefore(String dependentTaskName, Task task) {
|
|
|
|
Task dependentTask = tasks.findByPath(dependentTaskName);
|
|
|
|
if (dependentTask != null) {
|
|
|
|
dependentTask.dependsOn task
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-10-19 13:32:02 +00:00
|
|
|
gradle.projectsEvaluated {
|
2016-01-08 20:11:34 +00:00
|
|
|
// 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 ->
|
2016-02-08 17:04:27 +00:00
|
|
|
// Create variant and target names
|
2016-07-10 12:31:26 +00:00
|
|
|
def flavorNameCapitalized = "${productFlavorName.capitalize()}"
|
|
|
|
def buildNameCapitalized = "${buildTypeName.capitalize()}"
|
|
|
|
def targetName = "${flavorNameCapitalized}${buildNameCapitalized}"
|
2016-02-08 17:04:27 +00:00
|
|
|
def targetPath = productFlavorName ?
|
|
|
|
"${productFlavorName}/${buildTypeName}" :
|
|
|
|
"${buildTypeName}"
|
2016-01-08 20:11:34 +00:00
|
|
|
|
|
|
|
// React js bundle directories
|
|
|
|
def jsBundleDirConfigName = "jsBundleDir${targetName}"
|
|
|
|
def jsBundleDir = elvisFile(config."$jsBundleDirConfigName") ?:
|
2016-02-08 17:04:27 +00:00
|
|
|
file("$buildDir/intermediates/assets/${targetPath}")
|
2016-01-08 20:11:34 +00:00
|
|
|
|
2016-02-26 01:20:43 +00:00
|
|
|
def resourcesDirConfigName = "resourcesDir${targetName}"
|
2016-01-08 20:11:34 +00:00
|
|
|
def resourcesDir = elvisFile(config."${resourcesDirConfigName}") ?:
|
2016-02-08 17:04:27 +00:00
|
|
|
file("$buildDir/intermediates/res/merged/${targetPath}")
|
2016-01-08 20:11:34 +00:00
|
|
|
def jsBundleFile = file("$jsBundleDir/$bundleAssetName")
|
|
|
|
|
|
|
|
// Bundle task name for variant
|
|
|
|
def bundleJsAndAssetsTaskName = "bundle${targetName}JsAndAssets"
|
|
|
|
|
2016-06-04 22:57:01 +00:00
|
|
|
// Additional node and packager commandline arguments
|
|
|
|
def nodeExecutableAndArgs = config.nodeExecutableAndArgs ?: ["node"]
|
2016-06-03 00:27:24 +00:00
|
|
|
def extraPackagerArgs = config.extraPackagerArgs ?: []
|
|
|
|
|
2016-01-08 20:11:34 +00:00
|
|
|
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)) {
|
2016-06-04 22:57:01 +00:00
|
|
|
commandLine("cmd", "/c", *nodeExecutableAndArgs, "node_modules/react-native/local-cli/cli.js", "bundle", "--platform", "android", "--dev", "${devEnabled}",
|
2016-08-02 23:36:54 +00:00
|
|
|
"--reset-cache", "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir, *extraPackagerArgs)
|
2016-01-08 20:11:34 +00:00
|
|
|
} else {
|
2016-06-04 22:57:01 +00:00
|
|
|
commandLine(*nodeExecutableAndArgs, "node_modules/react-native/local-cli/cli.js", "bundle", "--platform", "android", "--dev", "${devEnabled}",
|
2016-08-02 23:36:54 +00:00
|
|
|
"--reset-cache", "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir, *extraPackagerArgs)
|
2016-01-08 20:11:34 +00:00
|
|
|
}
|
|
|
|
|
2016-02-08 17:04:27 +00:00
|
|
|
enabled config."bundleIn${targetName}" ||
|
|
|
|
config."bundleIn${buildTypeName.capitalize()}" ?:
|
|
|
|
targetName.toLowerCase().contains("release")
|
2016-01-08 20:11:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Hook bundle${productFlavor}${buildType}JsAndAssets into the android build process
|
|
|
|
currentBundleTask.dependsOn("merge${targetName}Resources")
|
|
|
|
currentBundleTask.dependsOn("merge${targetName}Assets")
|
|
|
|
|
2016-07-10 12:31:26 +00:00
|
|
|
runBefore("process${flavorNameCapitalized}Armeabi-v7a${buildNameCapitalized}Resources", currentBundleTask)
|
|
|
|
runBefore("process${flavorNameCapitalized}X86${buildNameCapitalized}Resources", currentBundleTask)
|
2016-01-08 20:11:34 +00:00
|
|
|
runBefore("processUniversal${targetName}Resources", currentBundleTask)
|
|
|
|
runBefore("process${targetName}Resources", currentBundleTask)
|
2016-09-28 11:21:53 +00:00
|
|
|
runBefore("dataBindingProcessLayouts${targetName}", currentBundleTask)
|
2016-01-08 20:11:34 +00:00
|
|
|
}
|
|
|
|
}
|
2015-10-19 13:32:02 +00:00
|
|
|
}
|