Skip to content

Commit 9add5b6

Browse files
authored
Let Android release bundles skip --reset-cache (#59547)
1 parent 6e22123 commit 9add5b6

6 files changed

Lines changed: 116 additions & 1 deletion

File tree

‎packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.facebook.react.utils.BackwardCompatUtils.showJSCRemovalMessage
1313
import com.facebook.react.utils.NdkConfiguratorUtils.configureJsEnginePackagingOptions
1414
import com.facebook.react.utils.NdkConfiguratorUtils.configureNewArchPackagingOptions
1515
import com.facebook.react.utils.ProjectUtils.isHermesEnabled
16+
import com.facebook.react.utils.ProjectUtils.shouldResetMetroCacheBeforeBundling
1617
import com.facebook.react.utils.ProjectUtils.useThirdPartyJSC
1718
import com.facebook.react.utils.detectedCliFile
1819
import com.facebook.react.utils.detectedEntryFile
@@ -71,6 +72,7 @@ internal fun Project.configureReactTasks(variant: Variant, config: ReactExtensio
7172
task.cliFile.set(cliFile)
7273
task.bundleCommand.set(config.bundleCommand)
7374
task.entryFile.set(detectedEntryFile(config, entryFileEnvVariable))
75+
task.resetMetroCacheBeforeBundling.set(project.shouldResetMetroCacheBeforeBundling)
7476
task.extraPackagerArgs.set(config.extraPackagerArgs)
7577
task.bundleConfig.set(config.bundleConfig)
7678
task.bundleAssetName.set(config.bundleAssetName)

‎packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/BundleHermesCTask.kt‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ abstract class BundleHermesCTask : DefaultTask() {
6565

6666
@get:Input abstract val devEnabled: Property<Boolean>
6767

68+
@get:Input abstract val resetMetroCacheBeforeBundling: Property<Boolean>
69+
6870
@get:Input abstract val extraPackagerArgs: ListProperty<String>
6971

7072
@get:Input abstract val hermesCommand: Property<String>
@@ -152,7 +154,9 @@ abstract class BundleHermesCTask : DefaultTask() {
152154
add("android")
153155
add("--dev")
154156
add(devEnabled.get().toString())
155-
add("--reset-cache")
157+
if (resetMetroCacheBeforeBundling.get()) {
158+
add("--reset-cache")
159+
}
156160
add("--entry-file")
157161
add(entryFile.get().asFile.cliPath(rootFile))
158162
add("--bundle-output")

‎packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/ProjectUtils.kt‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@ import com.facebook.react.model.ModelPackageJson
1212
import com.facebook.react.utils.PropertyUtils.EDGE_TO_EDGE_ENABLED
1313
import com.facebook.react.utils.PropertyUtils.HERMES_ENABLED
1414
import com.facebook.react.utils.PropertyUtils.REACT_NATIVE_ARCHITECTURES
15+
import com.facebook.react.utils.PropertyUtils.RESET_METRO_CACHE_BEFORE_BUNDLING
1516
import com.facebook.react.utils.PropertyUtils.SCOPED_EDGE_TO_EDGE_ENABLED
1617
import com.facebook.react.utils.PropertyUtils.SCOPED_HERMES_ENABLED
1718
import com.facebook.react.utils.PropertyUtils.SCOPED_REACT_NATIVE_ARCHITECTURES
19+
import com.facebook.react.utils.PropertyUtils.SCOPED_RESET_METRO_CACHE_BEFORE_BUNDLING
1820
import com.facebook.react.utils.PropertyUtils.SCOPED_STRICT_CXX_API_ENABLED
1921
import com.facebook.react.utils.PropertyUtils.SCOPED_USE_THIRD_PARTY_JSC
2022
import com.facebook.react.utils.PropertyUtils.STRICT_CXX_API_ENABLED
@@ -72,6 +74,19 @@ internal object ProjectUtils {
7274
(project.hasProperty(SCOPED_USE_THIRD_PARTY_JSC) &&
7375
project.property(SCOPED_USE_THIRD_PARTY_JSC).toString().toBoolean())
7476

77+
internal val Project.shouldResetMetroCacheBeforeBundling: Boolean
78+
get() {
79+
val value =
80+
when {
81+
project.hasProperty(SCOPED_RESET_METRO_CACHE_BEFORE_BUNDLING) ->
82+
project.property(SCOPED_RESET_METRO_CACHE_BEFORE_BUNDLING)
83+
project.hasProperty(RESET_METRO_CACHE_BEFORE_BUNDLING) ->
84+
project.property(RESET_METRO_CACHE_BEFORE_BUNDLING)
85+
else -> return true
86+
}
87+
return value.toString().lowercase().toBooleanStrictOrNull() ?: true
88+
}
89+
7590
internal fun Project.needsCodegenFromPackageJson(rootProperty: DirectoryProperty): Boolean {
7691
val parsedPackageJson = readPackageJsonFile(this, rootProperty)
7792
return needsCodegenFromPackageJson(parsedPackageJson)

‎packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/PropertyUtils.kt‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,13 @@ object PropertyUtils {
5454
const val EXCLUSIVE_ENTEPRISE_REPOSITORY = "exclusiveEnterpriseRepository"
5555
const val SCOPED_EXCLUSIVE_ENTEPRISE_REPOSITORY = "react.exclusiveEnterpriseRepository"
5656

57+
/**
58+
* Public property that controls whether `--reset-cache` is passed to Metro when bundling the JS
59+
* for release builds. Default: true
60+
*/
61+
const val RESET_METRO_CACHE_BEFORE_BUNDLING = "resetMetroCacheBeforeBundling"
62+
const val SCOPED_RESET_METRO_CACHE_BEFORE_BUNDLING = "react.resetMetroCacheBeforeBundling"
63+
5764
/** By default we include JitPack to avoid breaking user builds */
5865
internal const val INCLUDE_JITPACK_REPOSITORY_DEFAULT = true
5966

‎packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/BundleHermesCTaskTest.kt‎

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ class BundleHermesCTaskTest {
9191
it.minifyEnabled.set(true)
9292
it.hermesEnabled.set(true)
9393
it.devEnabled.set(true)
94+
it.resetMetroCacheBeforeBundling.set(true)
9495
it.extraPackagerArgs.set(listOf("extra", "arg"))
9596
it.hermesCommand.set("./my-hermesc")
9697
it.hermesFlags.set(listOf("flag1", "flag2"))
@@ -102,6 +103,7 @@ class BundleHermesCTaskTest {
102103
assertThat(task.minifyEnabled.get()).isTrue()
103104
assertThat(task.hermesEnabled.get()).isTrue()
104105
assertThat(task.devEnabled.get()).isTrue()
106+
assertThat(task.resetMetroCacheBeforeBundling.get()).isTrue()
105107
assertThat(task.extraPackagerArgs.get()).isEqualTo(listOf("extra", "arg"))
106108
assertThat(task.hermesCommand.get()).isEqualTo("./my-hermesc")
107109
assertThat(task.hermesFlags.get()).isEqualTo(listOf("flag1", "flag2"))
@@ -211,6 +213,7 @@ class BundleHermesCTaskTest {
211213
it.resourcesDir.set(resourcesDir)
212214
it.bundleConfig.set(bundleConfig)
213215
it.minifyEnabled.set(true)
216+
it.resetMetroCacheBeforeBundling.set(true)
214217
it.extraPackagerArgs.set(listOf("--read-global-cache"))
215218
}
216219

@@ -265,6 +268,7 @@ class BundleHermesCTaskTest {
265268
it.resourcesDir.set(resourcesDir)
266269
it.bundleConfig.set(bundleConfig)
267270
it.minifyEnabled.set(true)
271+
it.resetMetroCacheBeforeBundling.set(true)
268272
it.extraPackagerArgs.set(listOf("--read-global-cache"))
269273
}
270274

@@ -318,6 +322,7 @@ class BundleHermesCTaskTest {
318322
it.entryFile.set(entryFile)
319323
it.resourcesDir.set(resourcesDir)
320324
it.minifyEnabled.set(true)
325+
it.resetMetroCacheBeforeBundling.set(true)
321326
it.extraPackagerArgs.set(listOf("--read-global-cache"))
322327
}
323328

@@ -326,6 +331,32 @@ class BundleHermesCTaskTest {
326331
assertThat(bundleCommand).doesNotContain("--config")
327332
}
328333

334+
@Test
335+
fun getBundleCommand_withResetMetroCacheBeforeBundlingDisabled_returnsCommandWithoutResetCache() {
336+
val entryFile = tempFolder.newFile("index.js")
337+
val cliFile = tempFolder.newFile("cli.js")
338+
val bundleFile = tempFolder.newFile("bundle.js")
339+
val sourceMapFile = tempFolder.newFile("bundle.js.map")
340+
val resourcesDir = tempFolder.newFolder("res")
341+
val task =
342+
createTestTask<BundleHermesCTask> {
343+
it.nodeExecutableAndArgs.set(listOf("node", "arg1", "arg2"))
344+
it.root.set(tempFolder.root)
345+
it.cliFile.set(cliFile)
346+
it.bundleCommand.set("bundle")
347+
it.devEnabled.set(true)
348+
it.entryFile.set(entryFile)
349+
it.resourcesDir.set(resourcesDir)
350+
it.minifyEnabled.set(true)
351+
it.resetMetroCacheBeforeBundling.set(false)
352+
it.extraPackagerArgs.set(listOf("--read-global-cache"))
353+
}
354+
355+
val bundleCommand = task.getBundleCommand(bundleFile, sourceMapFile)
356+
357+
assertThat(bundleCommand).doesNotContain("--reset-cache")
358+
}
359+
329360
@Test
330361
fun getHermescCommand_returnsCorrectCommand() {
331362
val customHermesc = "hermesc"

‎packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/ProjectUtilsTest.kt‎

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import com.facebook.react.utils.ProjectUtils.isHermesEnabled
1717
import com.facebook.react.utils.ProjectUtils.isNewArchEnabled
1818
import com.facebook.react.utils.ProjectUtils.isStrictCxxApiEnabled
1919
import com.facebook.react.utils.ProjectUtils.needsCodegenFromPackageJson
20+
import com.facebook.react.utils.ProjectUtils.shouldResetMetroCacheBeforeBundling
2021
import java.io.File
2122
import org.assertj.core.api.Assertions.assertThat
2223
import org.junit.Rule
@@ -116,6 +117,61 @@ class ProjectUtilsTest {
116117
assertThat(project.isEdgeToEdgeEnabled).isFalse()
117118
}
118119

120+
@Test
121+
fun shouldResetMetroCacheBeforeBundling_returnsTrueByDefault() {
122+
assertThat(createProject().shouldResetMetroCacheBeforeBundling).isTrue()
123+
}
124+
125+
@Test
126+
fun shouldResetMetroCacheBeforeBundling_withDisabledViaProperty_returnsFalse() {
127+
val project = createProject()
128+
project.extensions.extraProperties.set("resetMetroCacheBeforeBundling", "false")
129+
assertThat(project.shouldResetMetroCacheBeforeBundling).isFalse()
130+
}
131+
132+
@Test
133+
fun shouldResetMetroCacheBeforeBundling_withEnabledViaProperty_returnsTrue() {
134+
val project = createProject()
135+
project.extensions.extraProperties.set("resetMetroCacheBeforeBundling", "true")
136+
assertThat(project.shouldResetMetroCacheBeforeBundling).isTrue()
137+
}
138+
139+
@Test
140+
fun shouldResetMetroCacheBeforeBundling_withInvalidViaProperty_returnsTrue() {
141+
val project = createProject()
142+
project.extensions.extraProperties.set("resetMetroCacheBeforeBundling", "¯\\_(ツ)_/¯")
143+
assertThat(project.shouldResetMetroCacheBeforeBundling).isTrue()
144+
}
145+
146+
@Test
147+
fun shouldResetMetroCacheBeforeBundling_withDisabledViaScopedProperty_returnsFalse() {
148+
val project = createProject()
149+
project.extensions.extraProperties.set("react.resetMetroCacheBeforeBundling", "false")
150+
assertThat(project.shouldResetMetroCacheBeforeBundling).isFalse()
151+
}
152+
153+
@Test
154+
fun shouldResetMetroCacheBeforeBundling_withEnabledViaScopedProperty_returnsTrue() {
155+
val project = createProject()
156+
project.extensions.extraProperties.set("react.resetMetroCacheBeforeBundling", "true")
157+
assertThat(project.shouldResetMetroCacheBeforeBundling).isTrue()
158+
}
159+
160+
@Test
161+
fun shouldResetMetroCacheBeforeBundling_withInvalidViaScopedProperty_returnsTrue() {
162+
val project = createProject()
163+
project.extensions.extraProperties.set("react.resetMetroCacheBeforeBundling", "¯\\_(ツ)_/¯")
164+
assertThat(project.shouldResetMetroCacheBeforeBundling).isTrue()
165+
}
166+
167+
@Test
168+
fun shouldResetMetroCacheBeforeBundling_withBothProperties_scopedPropertyWins() {
169+
val project = createProject()
170+
project.extensions.extraProperties.set("resetMetroCacheBeforeBundling", "true")
171+
project.extensions.extraProperties.set("react.resetMetroCacheBeforeBundling", "false")
172+
assertThat(project.shouldResetMetroCacheBeforeBundling).isFalse()
173+
}
174+
119175
@Test
120176
fun isStrictCxxApiEnabled_returnsFalseByDefault() {
121177
assertThat(createProject().isStrictCxxApiEnabled).isFalse()

0 commit comments

Comments
 (0)