From 00b4873ba3e73b3995b6c91676ab9df98b668734 Mon Sep 17 00:00:00 2001 From: lazerg Date: Tue, 27 Oct 2026 20:50:45 +0500 Subject: [PATCH 1/3] Let Android release bundles skip --reset-cache --- .../com/facebook/react/ReactExtension.kt | 6 ++++ .../com/facebook/react/TaskConfiguration.kt | 1 + .../facebook/react/tasks/BundleHermesCTask.kt | 6 +++- .../react/tasks/BundleHermesCTaskTest.kt | 31 +++++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt index 2704dd9fc217..af01b8d016e4 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt @@ -92,6 +92,12 @@ abstract class ReactExtension @Inject constructor(val project: Project) { */ val enableSoCleanup: Property = objects.property(Boolean::class.java).convention(true) + /** + * Whether to pass `--reset-cache` to the [bundleCommand]. Disable it to keep the Metro cache + * between release builds. Default: true + */ + val resetMetroCache: Property = objects.property(Boolean::class.java).convention(true) + /** Extra args that will be passed to the [bundleCommand] Default: [] */ val extraPackagerArgs: ListProperty = objects.listProperty(String::class.java).convention(emptyList()) diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt index 89f7651af46e..473f0a83a0a1 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt @@ -71,6 +71,7 @@ internal fun Project.configureReactTasks(variant: Variant, config: ReactExtensio task.cliFile.set(cliFile) task.bundleCommand.set(config.bundleCommand) task.entryFile.set(detectedEntryFile(config, entryFileEnvVariable)) + task.resetMetroCache.set(config.resetMetroCache) task.extraPackagerArgs.set(config.extraPackagerArgs) task.bundleConfig.set(config.bundleConfig) task.bundleAssetName.set(config.bundleAssetName) diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/BundleHermesCTask.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/BundleHermesCTask.kt index 89ba3656a3e6..dd0ce4682a4e 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/BundleHermesCTask.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/BundleHermesCTask.kt @@ -65,6 +65,8 @@ abstract class BundleHermesCTask : DefaultTask() { @get:Input abstract val devEnabled: Property + @get:Input abstract val resetMetroCache: Property + @get:Input abstract val extraPackagerArgs: ListProperty @get:Input abstract val hermesCommand: Property @@ -152,7 +154,9 @@ abstract class BundleHermesCTask : DefaultTask() { add("android") add("--dev") add(devEnabled.get().toString()) - add("--reset-cache") + if (resetMetroCache.get()) { + add("--reset-cache") + } add("--entry-file") add(entryFile.get().asFile.cliPath(rootFile)) add("--bundle-output") diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/BundleHermesCTaskTest.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/BundleHermesCTaskTest.kt index a9fb597f5012..d1a55fa33578 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/BundleHermesCTaskTest.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/BundleHermesCTaskTest.kt @@ -91,6 +91,7 @@ class BundleHermesCTaskTest { it.minifyEnabled.set(true) it.hermesEnabled.set(true) it.devEnabled.set(true) + it.resetMetroCache.set(true) it.extraPackagerArgs.set(listOf("extra", "arg")) it.hermesCommand.set("./my-hermesc") it.hermesFlags.set(listOf("flag1", "flag2")) @@ -102,6 +103,7 @@ class BundleHermesCTaskTest { assertThat(task.minifyEnabled.get()).isTrue() assertThat(task.hermesEnabled.get()).isTrue() assertThat(task.devEnabled.get()).isTrue() + assertThat(task.resetMetroCache.get()).isTrue() assertThat(task.extraPackagerArgs.get()).isEqualTo(listOf("extra", "arg")) assertThat(task.hermesCommand.get()).isEqualTo("./my-hermesc") assertThat(task.hermesFlags.get()).isEqualTo(listOf("flag1", "flag2")) @@ -211,6 +213,7 @@ class BundleHermesCTaskTest { it.resourcesDir.set(resourcesDir) it.bundleConfig.set(bundleConfig) it.minifyEnabled.set(true) + it.resetMetroCache.set(true) it.extraPackagerArgs.set(listOf("--read-global-cache")) } @@ -265,6 +268,7 @@ class BundleHermesCTaskTest { it.resourcesDir.set(resourcesDir) it.bundleConfig.set(bundleConfig) it.minifyEnabled.set(true) + it.resetMetroCache.set(true) it.extraPackagerArgs.set(listOf("--read-global-cache")) } @@ -318,6 +322,7 @@ class BundleHermesCTaskTest { it.entryFile.set(entryFile) it.resourcesDir.set(resourcesDir) it.minifyEnabled.set(true) + it.resetMetroCache.set(true) it.extraPackagerArgs.set(listOf("--read-global-cache")) } @@ -326,6 +331,32 @@ class BundleHermesCTaskTest { assertThat(bundleCommand).doesNotContain("--config") } + @Test + fun getBundleCommand_withResetMetroCacheDisabled_returnsCommandWithoutResetCache() { + val entryFile = tempFolder.newFile("index.js") + val cliFile = tempFolder.newFile("cli.js") + val bundleFile = tempFolder.newFile("bundle.js") + val sourceMapFile = tempFolder.newFile("bundle.js.map") + val resourcesDir = tempFolder.newFolder("res") + val task = + createTestTask { + it.nodeExecutableAndArgs.set(listOf("node", "arg1", "arg2")) + it.root.set(tempFolder.root) + it.cliFile.set(cliFile) + it.bundleCommand.set("bundle") + it.devEnabled.set(true) + it.entryFile.set(entryFile) + it.resourcesDir.set(resourcesDir) + it.minifyEnabled.set(true) + it.resetMetroCache.set(false) + it.extraPackagerArgs.set(listOf("--read-global-cache")) + } + + val bundleCommand = task.getBundleCommand(bundleFile, sourceMapFile) + + assertThat(bundleCommand).doesNotContain("--reset-cache") + } + @Test fun getHermescCommand_returnsCorrectCommand() { val customHermesc = "hermesc" From 91976541cb69bc3995c3d5dd87a4e58cd2c47c10 Mon Sep 17 00:00:00 2001 From: lazerg Date: Fri, 30 Oct 2026 19:59:22 +0500 Subject: [PATCH 2/3] Move Metro cache reset to react.resetMetroCacheBeforeBundling property --- .../com/facebook/react/ReactExtension.kt | 6 ----- .../com/facebook/react/TaskConfiguration.kt | 3 ++- .../facebook/react/tasks/BundleHermesCTask.kt | 4 +-- .../com/facebook/react/utils/ProjectUtils.kt | 13 +++++++++ .../com/facebook/react/utils/PropertyUtils.kt | 6 +++++ .../react/tasks/BundleHermesCTaskTest.kt | 14 +++++----- .../facebook/react/utils/ProjectUtilsTest.kt | 27 +++++++++++++++++++ 7 files changed, 57 insertions(+), 16 deletions(-) diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt index af01b8d016e4..2704dd9fc217 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt @@ -92,12 +92,6 @@ abstract class ReactExtension @Inject constructor(val project: Project) { */ val enableSoCleanup: Property = objects.property(Boolean::class.java).convention(true) - /** - * Whether to pass `--reset-cache` to the [bundleCommand]. Disable it to keep the Metro cache - * between release builds. Default: true - */ - val resetMetroCache: Property = objects.property(Boolean::class.java).convention(true) - /** Extra args that will be passed to the [bundleCommand] Default: [] */ val extraPackagerArgs: ListProperty = objects.listProperty(String::class.java).convention(emptyList()) diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt index 473f0a83a0a1..c1700b4c1fff 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt @@ -13,6 +13,7 @@ import com.facebook.react.utils.BackwardCompatUtils.showJSCRemovalMessage import com.facebook.react.utils.NdkConfiguratorUtils.configureJsEnginePackagingOptions import com.facebook.react.utils.NdkConfiguratorUtils.configureNewArchPackagingOptions import com.facebook.react.utils.ProjectUtils.isHermesEnabled +import com.facebook.react.utils.ProjectUtils.shouldResetMetroCacheBeforeBundling import com.facebook.react.utils.ProjectUtils.useThirdPartyJSC import com.facebook.react.utils.detectedCliFile import com.facebook.react.utils.detectedEntryFile @@ -71,7 +72,7 @@ internal fun Project.configureReactTasks(variant: Variant, config: ReactExtensio task.cliFile.set(cliFile) task.bundleCommand.set(config.bundleCommand) task.entryFile.set(detectedEntryFile(config, entryFileEnvVariable)) - task.resetMetroCache.set(config.resetMetroCache) + task.resetMetroCacheBeforeBundling.set(project.shouldResetMetroCacheBeforeBundling) task.extraPackagerArgs.set(config.extraPackagerArgs) task.bundleConfig.set(config.bundleConfig) task.bundleAssetName.set(config.bundleAssetName) diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/BundleHermesCTask.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/BundleHermesCTask.kt index dd0ce4682a4e..444352dff4d5 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/BundleHermesCTask.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/BundleHermesCTask.kt @@ -65,7 +65,7 @@ abstract class BundleHermesCTask : DefaultTask() { @get:Input abstract val devEnabled: Property - @get:Input abstract val resetMetroCache: Property + @get:Input abstract val resetMetroCacheBeforeBundling: Property @get:Input abstract val extraPackagerArgs: ListProperty @@ -154,7 +154,7 @@ abstract class BundleHermesCTask : DefaultTask() { add("android") add("--dev") add(devEnabled.get().toString()) - if (resetMetroCache.get()) { + if (resetMetroCacheBeforeBundling.get()) { add("--reset-cache") } add("--entry-file") diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/ProjectUtils.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/ProjectUtils.kt index 855e34df90ab..e737f830ecd1 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/ProjectUtils.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/ProjectUtils.kt @@ -12,6 +12,7 @@ import com.facebook.react.model.ModelPackageJson import com.facebook.react.utils.PropertyUtils.EDGE_TO_EDGE_ENABLED import com.facebook.react.utils.PropertyUtils.HERMES_ENABLED import com.facebook.react.utils.PropertyUtils.REACT_NATIVE_ARCHITECTURES +import com.facebook.react.utils.PropertyUtils.RESET_METRO_CACHE_BEFORE_BUNDLING import com.facebook.react.utils.PropertyUtils.SCOPED_EDGE_TO_EDGE_ENABLED import com.facebook.react.utils.PropertyUtils.SCOPED_HERMES_ENABLED import com.facebook.react.utils.PropertyUtils.SCOPED_REACT_NATIVE_ARCHITECTURES @@ -72,6 +73,18 @@ internal object ProjectUtils { (project.hasProperty(SCOPED_USE_THIRD_PARTY_JSC) && project.property(SCOPED_USE_THIRD_PARTY_JSC).toString().toBoolean()) + internal val Project.shouldResetMetroCacheBeforeBundling: Boolean + get() = + if (project.hasProperty(RESET_METRO_CACHE_BEFORE_BUNDLING)) { + project + .property(RESET_METRO_CACHE_BEFORE_BUNDLING) + .toString() + .lowercase() + .toBooleanStrictOrNull() ?: true + } else { + true + } + internal fun Project.needsCodegenFromPackageJson(rootProperty: DirectoryProperty): Boolean { val parsedPackageJson = readPackageJsonFile(this, rootProperty) return needsCodegenFromPackageJson(parsedPackageJson) diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/PropertyUtils.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/PropertyUtils.kt index 32dd486eaf77..39c3a9e158a1 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/PropertyUtils.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/PropertyUtils.kt @@ -54,6 +54,12 @@ object PropertyUtils { const val EXCLUSIVE_ENTEPRISE_REPOSITORY = "exclusiveEnterpriseRepository" const val SCOPED_EXCLUSIVE_ENTEPRISE_REPOSITORY = "react.exclusiveEnterpriseRepository" + /** + * Public property that controls whether `--reset-cache` is passed to Metro when bundling the JS + * for release builds. Default: true + */ + const val RESET_METRO_CACHE_BEFORE_BUNDLING = "react.resetMetroCacheBeforeBundling" + /** By default we include JitPack to avoid breaking user builds */ internal const val INCLUDE_JITPACK_REPOSITORY_DEFAULT = true diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/BundleHermesCTaskTest.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/BundleHermesCTaskTest.kt index d1a55fa33578..0cbae3d1622b 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/BundleHermesCTaskTest.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/BundleHermesCTaskTest.kt @@ -91,7 +91,7 @@ class BundleHermesCTaskTest { it.minifyEnabled.set(true) it.hermesEnabled.set(true) it.devEnabled.set(true) - it.resetMetroCache.set(true) + it.resetMetroCacheBeforeBundling.set(true) it.extraPackagerArgs.set(listOf("extra", "arg")) it.hermesCommand.set("./my-hermesc") it.hermesFlags.set(listOf("flag1", "flag2")) @@ -103,7 +103,7 @@ class BundleHermesCTaskTest { assertThat(task.minifyEnabled.get()).isTrue() assertThat(task.hermesEnabled.get()).isTrue() assertThat(task.devEnabled.get()).isTrue() - assertThat(task.resetMetroCache.get()).isTrue() + assertThat(task.resetMetroCacheBeforeBundling.get()).isTrue() assertThat(task.extraPackagerArgs.get()).isEqualTo(listOf("extra", "arg")) assertThat(task.hermesCommand.get()).isEqualTo("./my-hermesc") assertThat(task.hermesFlags.get()).isEqualTo(listOf("flag1", "flag2")) @@ -213,7 +213,7 @@ class BundleHermesCTaskTest { it.resourcesDir.set(resourcesDir) it.bundleConfig.set(bundleConfig) it.minifyEnabled.set(true) - it.resetMetroCache.set(true) + it.resetMetroCacheBeforeBundling.set(true) it.extraPackagerArgs.set(listOf("--read-global-cache")) } @@ -268,7 +268,7 @@ class BundleHermesCTaskTest { it.resourcesDir.set(resourcesDir) it.bundleConfig.set(bundleConfig) it.minifyEnabled.set(true) - it.resetMetroCache.set(true) + it.resetMetroCacheBeforeBundling.set(true) it.extraPackagerArgs.set(listOf("--read-global-cache")) } @@ -322,7 +322,7 @@ class BundleHermesCTaskTest { it.entryFile.set(entryFile) it.resourcesDir.set(resourcesDir) it.minifyEnabled.set(true) - it.resetMetroCache.set(true) + it.resetMetroCacheBeforeBundling.set(true) it.extraPackagerArgs.set(listOf("--read-global-cache")) } @@ -332,7 +332,7 @@ class BundleHermesCTaskTest { } @Test - fun getBundleCommand_withResetMetroCacheDisabled_returnsCommandWithoutResetCache() { + fun getBundleCommand_withResetMetroCacheBeforeBundlingDisabled_returnsCommandWithoutResetCache() { val entryFile = tempFolder.newFile("index.js") val cliFile = tempFolder.newFile("cli.js") val bundleFile = tempFolder.newFile("bundle.js") @@ -348,7 +348,7 @@ class BundleHermesCTaskTest { it.entryFile.set(entryFile) it.resourcesDir.set(resourcesDir) it.minifyEnabled.set(true) - it.resetMetroCache.set(false) + it.resetMetroCacheBeforeBundling.set(false) it.extraPackagerArgs.set(listOf("--read-global-cache")) } diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/ProjectUtilsTest.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/ProjectUtilsTest.kt index 64fb15c42494..3e4a34267253 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/ProjectUtilsTest.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/ProjectUtilsTest.kt @@ -17,6 +17,7 @@ import com.facebook.react.utils.ProjectUtils.isHermesEnabled import com.facebook.react.utils.ProjectUtils.isNewArchEnabled import com.facebook.react.utils.ProjectUtils.isStrictCxxApiEnabled import com.facebook.react.utils.ProjectUtils.needsCodegenFromPackageJson +import com.facebook.react.utils.ProjectUtils.shouldResetMetroCacheBeforeBundling import java.io.File import org.assertj.core.api.Assertions.assertThat import org.junit.Rule @@ -116,6 +117,32 @@ class ProjectUtilsTest { assertThat(project.isEdgeToEdgeEnabled).isFalse() } + @Test + fun shouldResetMetroCacheBeforeBundling_returnsTrueByDefault() { + assertThat(createProject().shouldResetMetroCacheBeforeBundling).isTrue() + } + + @Test + fun shouldResetMetroCacheBeforeBundling_withDisabledViaProperty_returnsFalse() { + val project = createProject() + project.extensions.extraProperties.set("react.resetMetroCacheBeforeBundling", "false") + assertThat(project.shouldResetMetroCacheBeforeBundling).isFalse() + } + + @Test + fun shouldResetMetroCacheBeforeBundling_withEnabledViaProperty_returnsTrue() { + val project = createProject() + project.extensions.extraProperties.set("react.resetMetroCacheBeforeBundling", "true") + assertThat(project.shouldResetMetroCacheBeforeBundling).isTrue() + } + + @Test + fun shouldResetMetroCacheBeforeBundling_withInvalidViaProperty_returnsTrue() { + val project = createProject() + project.extensions.extraProperties.set("react.resetMetroCacheBeforeBundling", "¯\\_(ツ)_/¯") + assertThat(project.shouldResetMetroCacheBeforeBundling).isTrue() + } + @Test fun isStrictCxxApiEnabled_returnsFalseByDefault() { assertThat(createProject().isStrictCxxApiEnabled).isFalse() From c50219c7d395915509573794fadb5d8d5ab8062d Mon Sep 17 00:00:00 2001 From: lazerg Date: Fri, 30 Oct 2026 20:58:07 +0500 Subject: [PATCH 3/3] Accept scoped and unscoped resetMetroCacheBeforeBundling properties --- .../com/facebook/react/utils/ProjectUtils.kt | 22 +++++++------ .../com/facebook/react/utils/PropertyUtils.kt | 3 +- .../facebook/react/utils/ProjectUtilsTest.kt | 33 +++++++++++++++++-- 3 files changed, 45 insertions(+), 13 deletions(-) diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/ProjectUtils.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/ProjectUtils.kt index e737f830ecd1..814d20cd7dae 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/ProjectUtils.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/ProjectUtils.kt @@ -16,6 +16,7 @@ import com.facebook.react.utils.PropertyUtils.RESET_METRO_CACHE_BEFORE_BUNDLING import com.facebook.react.utils.PropertyUtils.SCOPED_EDGE_TO_EDGE_ENABLED import com.facebook.react.utils.PropertyUtils.SCOPED_HERMES_ENABLED import com.facebook.react.utils.PropertyUtils.SCOPED_REACT_NATIVE_ARCHITECTURES +import com.facebook.react.utils.PropertyUtils.SCOPED_RESET_METRO_CACHE_BEFORE_BUNDLING import com.facebook.react.utils.PropertyUtils.SCOPED_STRICT_CXX_API_ENABLED import com.facebook.react.utils.PropertyUtils.SCOPED_USE_THIRD_PARTY_JSC import com.facebook.react.utils.PropertyUtils.STRICT_CXX_API_ENABLED @@ -74,16 +75,17 @@ internal object ProjectUtils { project.property(SCOPED_USE_THIRD_PARTY_JSC).toString().toBoolean()) internal val Project.shouldResetMetroCacheBeforeBundling: Boolean - get() = - if (project.hasProperty(RESET_METRO_CACHE_BEFORE_BUNDLING)) { - project - .property(RESET_METRO_CACHE_BEFORE_BUNDLING) - .toString() - .lowercase() - .toBooleanStrictOrNull() ?: true - } else { - true - } + get() { + val value = + when { + project.hasProperty(SCOPED_RESET_METRO_CACHE_BEFORE_BUNDLING) -> + project.property(SCOPED_RESET_METRO_CACHE_BEFORE_BUNDLING) + project.hasProperty(RESET_METRO_CACHE_BEFORE_BUNDLING) -> + project.property(RESET_METRO_CACHE_BEFORE_BUNDLING) + else -> return true + } + return value.toString().lowercase().toBooleanStrictOrNull() ?: true + } internal fun Project.needsCodegenFromPackageJson(rootProperty: DirectoryProperty): Boolean { val parsedPackageJson = readPackageJsonFile(this, rootProperty) diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/PropertyUtils.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/PropertyUtils.kt index 39c3a9e158a1..014d7410055e 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/PropertyUtils.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/PropertyUtils.kt @@ -58,7 +58,8 @@ object PropertyUtils { * Public property that controls whether `--reset-cache` is passed to Metro when bundling the JS * for release builds. Default: true */ - const val RESET_METRO_CACHE_BEFORE_BUNDLING = "react.resetMetroCacheBeforeBundling" + const val RESET_METRO_CACHE_BEFORE_BUNDLING = "resetMetroCacheBeforeBundling" + const val SCOPED_RESET_METRO_CACHE_BEFORE_BUNDLING = "react.resetMetroCacheBeforeBundling" /** By default we include JitPack to avoid breaking user builds */ internal const val INCLUDE_JITPACK_REPOSITORY_DEFAULT = true diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/ProjectUtilsTest.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/ProjectUtilsTest.kt index 3e4a34267253..cf369e547616 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/ProjectUtilsTest.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/ProjectUtilsTest.kt @@ -125,24 +125,53 @@ class ProjectUtilsTest { @Test fun shouldResetMetroCacheBeforeBundling_withDisabledViaProperty_returnsFalse() { val project = createProject() - project.extensions.extraProperties.set("react.resetMetroCacheBeforeBundling", "false") + project.extensions.extraProperties.set("resetMetroCacheBeforeBundling", "false") assertThat(project.shouldResetMetroCacheBeforeBundling).isFalse() } @Test fun shouldResetMetroCacheBeforeBundling_withEnabledViaProperty_returnsTrue() { val project = createProject() - project.extensions.extraProperties.set("react.resetMetroCacheBeforeBundling", "true") + project.extensions.extraProperties.set("resetMetroCacheBeforeBundling", "true") assertThat(project.shouldResetMetroCacheBeforeBundling).isTrue() } @Test fun shouldResetMetroCacheBeforeBundling_withInvalidViaProperty_returnsTrue() { + val project = createProject() + project.extensions.extraProperties.set("resetMetroCacheBeforeBundling", "¯\\_(ツ)_/¯") + assertThat(project.shouldResetMetroCacheBeforeBundling).isTrue() + } + + @Test + fun shouldResetMetroCacheBeforeBundling_withDisabledViaScopedProperty_returnsFalse() { + val project = createProject() + project.extensions.extraProperties.set("react.resetMetroCacheBeforeBundling", "false") + assertThat(project.shouldResetMetroCacheBeforeBundling).isFalse() + } + + @Test + fun shouldResetMetroCacheBeforeBundling_withEnabledViaScopedProperty_returnsTrue() { + val project = createProject() + project.extensions.extraProperties.set("react.resetMetroCacheBeforeBundling", "true") + assertThat(project.shouldResetMetroCacheBeforeBundling).isTrue() + } + + @Test + fun shouldResetMetroCacheBeforeBundling_withInvalidViaScopedProperty_returnsTrue() { val project = createProject() project.extensions.extraProperties.set("react.resetMetroCacheBeforeBundling", "¯\\_(ツ)_/¯") assertThat(project.shouldResetMetroCacheBeforeBundling).isTrue() } + @Test + fun shouldResetMetroCacheBeforeBundling_withBothProperties_scopedPropertyWins() { + val project = createProject() + project.extensions.extraProperties.set("resetMetroCacheBeforeBundling", "true") + project.extensions.extraProperties.set("react.resetMetroCacheBeforeBundling", "false") + assertThat(project.shouldResetMetroCacheBeforeBundling).isFalse() + } + @Test fun isStrictCxxApiEnabled_returnsFalseByDefault() { assertThat(createProject().isStrictCxxApiEnabled).isFalse()