@@ -6,112 +6,117 @@ def cliPath = config.cliPath ?: "node_modules/react-native/local-cli/cli.js"
6
6
def bundleAssetName = config. bundleAssetName ?: " index.android.bundle"
7
7
def entryFile = config. entryFile ?: " index.android.js"
8
8
def bundleCommand = config. bundleCommand ?: " bundle"
9
-
10
- // because elvis operator
11
- def elvisFile (thing ) {
12
- return thing ? file(thing) : null ;
13
- }
14
-
15
- def reactRoot = elvisFile(config. root) ?: file(" ../../" )
9
+ def reactRoot = file(config. root ?: " ../../" )
16
10
def inputExcludes = config. inputExcludes ?: [" android/**" , " ios/**" ]
17
11
def bundleConfig = config. bundleConfig ? " ${ reactRoot} /${ config.bundleConfig} " : null ;
18
12
19
- void runBefore (String dependentTaskName , Task task ) {
20
- Task dependentTask = tasks. findByPath(dependentTaskName);
21
- if (dependentTask != null ) {
22
- dependentTask. dependsOn task
23
- }
24
- }
25
13
26
14
gradle. projectsEvaluated {
27
- // Grab all build types and product flavors
28
- def buildTypes = android. buildTypes. collect { type -> type. name }
29
- def productFlavors = android. productFlavors. collect { flavor -> flavor. name }
30
-
31
- // When no product flavors defined, use empty
32
- if (! productFlavors) productFlavors. add(' ' )
33
-
34
- productFlavors. each { productFlavorName ->
35
- buildTypes. each { buildTypeName ->
36
- // Create variant and target names
37
- def flavorNameCapitalized = " ${ productFlavorName.capitalize()} "
38
- def buildNameCapitalized = " ${ buildTypeName.capitalize()} "
39
- def targetName = " ${ flavorNameCapitalized}${ buildNameCapitalized} "
40
- def targetPath = productFlavorName ?
41
- " ${ productFlavorName} /${ buildTypeName} " :
42
- " ${ buildTypeName} "
43
-
44
- // React js bundle directories
45
- def jsBundleDirConfigName = " jsBundleDir${ targetName} "
46
- def jsBundleDir = elvisFile(config. " $jsBundleDirConfigName " ) ?:
47
- file(" $buildDir /intermediates/assets/${ targetPath} " )
48
-
49
- def resourcesDirConfigName = " resourcesDir${ targetName} "
50
- def resourcesDir = elvisFile(config. " ${ resourcesDirConfigName} " ) ?:
51
- file(" $buildDir /intermediates/res/merged/${ targetPath} " )
52
- def jsBundleFile = file(" $jsBundleDir /$bundleAssetName " )
53
-
54
- // Bundle task name for variant
55
- def bundleJsAndAssetsTaskName = " bundle${ targetName} JsAndAssets"
56
-
57
- // Additional node and packager commandline arguments
58
- def nodeExecutableAndArgs = config. nodeExecutableAndArgs ?: [" node" ]
59
- def extraPackagerArgs = config. extraPackagerArgs ?: []
60
-
61
- def currentBundleTask = tasks. create(
62
- name : bundleJsAndAssetsTaskName,
63
- type : Exec ) {
15
+ android. applicationVariants. all { def variant ->
16
+ // Create variant and target names
17
+ def targetName = variant. name. capitalize()
18
+ def targetPath = variant. dirName
19
+
20
+ // React js bundle directories
21
+ def jsBundleDir = file(" $buildDir /generated/assets/react/${ targetPath} " )
22
+ def resourcesDir = file(" $buildDir /generated/res/react/${ targetPath} " )
23
+
24
+ def jsBundleFile = file(" $jsBundleDir /$bundleAssetName " )
25
+
26
+ // Additional node and packager commandline arguments
27
+ def nodeExecutableAndArgs = config. nodeExecutableAndArgs ?: [" node" ]
28
+ def extraPackagerArgs = config. extraPackagerArgs ?: []
29
+
30
+ def currentBundleTask = tasks. create(
31
+ name : " bundle${ targetName} JsAndAssets" ,
32
+ type : Exec ) {
33
+ group = " react"
34
+ description = " bundle JS and assets for ${ targetName} ."
35
+
36
+ // Create dirs if they are not there (e.g. the "clean" task just ran)
37
+ doFirst {
38
+ jsBundleDir. deleteDir()
39
+ jsBundleDir. mkdirs()
40
+ resourcesDir. deleteDir()
41
+ resourcesDir. mkdirs()
42
+ }
43
+
44
+ // Set up inputs and outputs so gradle can cache the result
45
+ inputs. files fileTree(dir : reactRoot, excludes : inputExcludes)
46
+ outputs. dir jsBundleDir
47
+ outputs. dir resourcesDir
48
+
49
+ // Set up the call to the react-native cli
50
+ workingDir reactRoot
51
+
52
+ // Set up dev mode
53
+ def devEnabled = ! (config. " devDisabledIn${ targetName} "
54
+ || targetName. toLowerCase(). contains(" release" ))
55
+
56
+ def extraArgs = extraPackagerArgs;
57
+
58
+ if (bundleConfig) {
59
+ extraArgs = extraArgs. clone()
60
+ extraArgs. add(" --config" );
61
+ extraArgs. add(bundleConfig);
62
+ }
63
+
64
+ if (Os . isFamily(Os . FAMILY_WINDOWS )) {
65
+ commandLine(" cmd" , " /c" , * nodeExecutableAndArgs, cliPath, bundleCommand, " --platform" , " android" , " --dev" , " ${ devEnabled} " ,
66
+ " --reset-cache" , " --entry-file" , entryFile, " --bundle-output" , jsBundleFile, " --assets-dest" , resourcesDir, * extraArgs)
67
+ } else {
68
+ commandLine(* nodeExecutableAndArgs, cliPath, bundleCommand, " --platform" , " android" , " --dev" , " ${ devEnabled} " ,
69
+ " --reset-cache" , " --entry-file" , entryFile, " --bundle-output" , jsBundleFile, " --assets-dest" , resourcesDir, * extraArgs)
70
+ }
71
+
72
+ enabled config. " bundleIn${ targetName} " ||
73
+ config. " bundleIn${ variant.buildType.name.capitalize()} " ?:
74
+ targetName. toLowerCase(). contains(" release" )
75
+ }
76
+
77
+ // Expose a minimal interface on the application variant and the task itself:
78
+ variant. ext. bundleJsAndAssets = currentBundleTask
79
+ currentBundleTask. ext. generatedResFolders = files(resourcesDir). builtBy(currentBundleTask)
80
+ currentBundleTask. ext. generatedAssetsFolders = files(jsBundleDir). builtBy(currentBundleTask)
81
+
82
+ variant. registerGeneratedResFolders(currentBundleTask. generatedResFolders)
83
+ variant. mergeResources. dependsOn(currentBundleTask)
84
+
85
+ def resourcesDirConfigValue = config. " resourcesDir${ targetName} "
86
+ if (resourcesDirConfigValue) {
87
+ def currentCopyResTask = tasks. create(
88
+ name : " copy${ targetName} BundledResources" ,
89
+ type : Copy ) {
64
90
group = " react"
65
- description = " bundle JS and assets for ${ targetName} ."
66
-
67
- // Create dirs if they are not there (e.g. the "clean" task just ran)
68
- doFirst {
69
- jsBundleDir. mkdirs()
70
- resourcesDir. mkdirs()
71
- }
72
-
73
- // Set up inputs and outputs so gradle can cache the result
74
- inputs. files fileTree(dir : reactRoot, excludes : inputExcludes)
75
- outputs. dir jsBundleDir
76
- outputs. dir resourcesDir
77
-
78
- // Set up the call to the react-native cli
79
- workingDir reactRoot
80
-
81
- // Set up dev mode
82
- def devEnabled = ! (config. " devDisabledIn${ targetName} "
83
- || targetName. toLowerCase(). contains(" release" ))
84
-
85
- def extraArgs = extraPackagerArgs;
86
-
87
- if (bundleConfig) {
88
- extraArgs = extraArgs. clone()
89
- extraArgs. add(" --config" );
90
- extraArgs. add(bundleConfig);
91
- }
92
-
93
- if (Os . isFamily(Os . FAMILY_WINDOWS )) {
94
- commandLine(" cmd" , " /c" , * nodeExecutableAndArgs, cliPath, bundleCommand, " --platform" , " android" , " --dev" , " ${ devEnabled} " ,
95
- " --reset-cache" , " --entry-file" , entryFile, " --bundle-output" , jsBundleFile, " --assets-dest" , resourcesDir, * extraArgs)
96
- } else {
97
- commandLine(* nodeExecutableAndArgs, cliPath, bundleCommand, " --platform" , " android" , " --dev" , " ${ devEnabled} " ,
98
- " --reset-cache" , " --entry-file" , entryFile, " --bundle-output" , jsBundleFile, " --assets-dest" , resourcesDir, * extraArgs)
99
- }
100
-
101
- enabled config. " bundleIn${ targetName} " ||
102
- config. " bundleIn${ buildTypeName.capitalize()} " ?:
103
- targetName. toLowerCase(). contains(" release" )
91
+ description = " copy bundled resources into custom location for ${ targetName} ."
92
+
93
+ from resourcesDir
94
+ into file(resourcesDirConfigValue)
95
+
96
+ dependsOn(currentBundleTask)
97
+
98
+ enabled currentBundleTask. enabled
104
99
}
105
100
106
- // Hook bundle${productFlavor}${buildType}JsAndAssets into the android build process
107
- currentBundleTask. dependsOn(" merge${ targetName} Resources" )
108
- currentBundleTask. dependsOn(" merge${ targetName} Assets" )
101
+ variant. packageApplication. dependsOn(currentCopyResTask)
102
+ }
103
+
104
+ def currentAssetsCopyTask = tasks. create(
105
+ name : " copy${ targetName} BundledJs" ,
106
+ type : Copy ) {
107
+ group = " react"
108
+ description = " copy bundled JS into ${ targetName} ."
109
109
110
- runBefore(" process${ flavorNameCapitalized} Armeabi-v7a${ buildNameCapitalized} Resources" , currentBundleTask)
111
- runBefore(" process${ flavorNameCapitalized} X86${ buildNameCapitalized} Resources" , currentBundleTask)
112
- runBefore(" processUniversal${ targetName} Resources" , currentBundleTask)
113
- runBefore(" process${ targetName} Resources" , currentBundleTask)
114
- runBefore(" dataBindingProcessLayouts${ targetName} " , currentBundleTask)
110
+ from jsBundleDir
111
+ into file(config. " jsBundleDir${ targetName} " ?:
112
+ " $buildDir /intermediates/assets/${ targetPath} " )
113
+
114
+ // mergeAssets must run first, as it clears the intermediates directory
115
+ dependsOn(variant. mergeAssets)
116
+
117
+ enabled currentBundleTask. enabled
115
118
}
119
+
120
+ variant. packageApplication. dependsOn(currentAssetsCopyTask)
116
121
}
117
122
}
0 commit comments