mirror of
https://github.com/status-im/react-native.git
synced 2025-01-10 17:45:59 +00:00
e268883fdc
Summary: unbundle is a useful feature, and it should be exposed. In order to get the most use out of we expose it as an option at build time in the Build Phase on XCode and the project.ext.react config in the build.gradle. Because it is best used with inline requires we add a section under performance that describes how inline requires can be implemented and how to use with the unbundling feature. Testing: - Added a section of the doc which explains how the feature can be enabled - Use the instructions, build a build on iOS + android (using release so that the bundle is created) and confirm that the bundle has the binary header information. Closes https://github.com/facebook/react-native/pull/15317 Differential Revision: D6054642 Pulled By: hramos fbshipit-source-id: 067f4d2f78d91215709bd3e3636f460bc2b17e99
118 lines
5.3 KiB
Groovy
118 lines
5.3 KiB
Groovy
import org.apache.tools.ant.taskdefs.condition.Os
|
|
|
|
def config = project.hasProperty("react") ? project.react : [];
|
|
|
|
def cliPath = config.cliPath ?: "node_modules/react-native/local-cli/cli.js"
|
|
def bundleAssetName = config.bundleAssetName ?: "index.android.bundle"
|
|
def entryFile = config.entryFile ?: "index.android.js"
|
|
def bundleCommand = config.bundleCommand ?: "bundle"
|
|
|
|
// because elvis operator
|
|
def elvisFile(thing) {
|
|
return thing ? file(thing) : null;
|
|
}
|
|
|
|
def reactRoot = elvisFile(config.root) ?: file("../../")
|
|
def inputExcludes = config.inputExcludes ?: ["android/**", "ios/**"]
|
|
def bundleConfig = config.bundleConfig ? "${reactRoot}/${config.bundleConfig}" : null ;
|
|
|
|
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 flavorNameCapitalized = "${productFlavorName.capitalize()}"
|
|
def buildNameCapitalized = "${buildTypeName.capitalize()}"
|
|
def targetName = "${flavorNameCapitalized}${buildNameCapitalized}"
|
|
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 = "resourcesDir${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"
|
|
|
|
// Additional node and packager commandline arguments
|
|
def nodeExecutableAndArgs = config.nodeExecutableAndArgs ?: ["node"]
|
|
def extraPackagerArgs = config.extraPackagerArgs ?: []
|
|
|
|
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 = !(config."devDisabledIn${targetName}"
|
|
|| targetName.toLowerCase().contains("release"))
|
|
|
|
def extraArgs = extraPackagerArgs;
|
|
|
|
if (bundleConfig) {
|
|
extraArgs = extraArgs.clone()
|
|
extraArgs.add("--config");
|
|
extraArgs.add(bundleConfig);
|
|
}
|
|
|
|
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
|
|
commandLine("cmd", "/c", *nodeExecutableAndArgs, cliPath, bundleCommand, "--platform", "android", "--dev", "${devEnabled}",
|
|
"--reset-cache", "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir, *extraArgs)
|
|
} else {
|
|
commandLine(*nodeExecutableAndArgs, cliPath, bundleCommand, "--platform", "android", "--dev", "${devEnabled}",
|
|
"--reset-cache", "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir, *extraArgs)
|
|
}
|
|
|
|
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("process${flavorNameCapitalized}Armeabi-v7a${buildNameCapitalized}Resources", currentBundleTask)
|
|
runBefore("process${flavorNameCapitalized}X86${buildNameCapitalized}Resources", currentBundleTask)
|
|
runBefore("processUniversal${targetName}Resources", currentBundleTask)
|
|
runBefore("process${targetName}Resources", currentBundleTask)
|
|
runBefore("dataBindingProcessLayouts${targetName}", currentBundleTask)
|
|
}
|
|
}
|
|
}
|