From fedbe2d48656e1196774ddaf3f52c70f1ef521cb Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Tue, 23 Jul 2024 04:41:54 -0700 Subject: [PATCH] Fix core autolinking not working on Windows (#45572) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/45572 0.75-rc.5 is currently broken on Windows. This is due to us invoking `npx react-native-community/cli config` without a `cmd /c` prefix. This fixes it by using our function `windowsAwareCommandLine`. The problem is that this required a lot of refactoring since that util was not available for the settings plugin. Fixes #45403 Changelog: [Internal] [Changed] - Fix core autolinking not working on Windows Reviewed By: cipolleschi Differential Revision: D60037587 fbshipit-source-id: eefeda7aafc43b9ce08f0f9225b0847fad2f46b7 --- .circleci/configurations/jobs.yml | 1 + packages/gradle-plugin/.gitignore | 1 + .../build.gradle.kts | 1 + .../settings-plugin/build.gradle.kts | 1 + .../facebook/react/ReactSettingsExtension.kt | 8 +++- packages/gradle-plugin/settings.gradle.kts | 1 + .../shared-testutil/build.gradle.kts | 38 +++++++++++++++++++ .../kotlin/com/facebook/react/tests/OsRule.kt | 0 .../kotlin/com/facebook/react/tests/WithOs.kt | 0 .../gradle-plugin/shared/build.gradle.kts | 1 + .../react/utils/KotlinStdlibCompatUtils.kt | 0 .../kotlin/com/facebook/react/utils/Os.kt | 2 +- .../com/facebook/react/utils/TaskUtils.kt | 7 ++-- .../utils/KotlinStdlibCompatUtilsTest.kt | 0 .../kotlin/com/facebook/react/utils/OsTest.kt | 0 .../com/facebook/react/utils/TaskUtilsTest.kt | 0 16 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 packages/gradle-plugin/shared-testutil/build.gradle.kts rename packages/gradle-plugin/{react-native-gradle-plugin/src/test => shared-testutil/src/main}/kotlin/com/facebook/react/tests/OsRule.kt (100%) rename packages/gradle-plugin/{react-native-gradle-plugin/src/test => shared-testutil/src/main}/kotlin/com/facebook/react/tests/WithOs.kt (100%) rename packages/gradle-plugin/{react-native-gradle-plugin => shared}/src/main/kotlin/com/facebook/react/utils/KotlinStdlibCompatUtils.kt (100%) rename packages/gradle-plugin/{react-native-gradle-plugin => shared}/src/main/kotlin/com/facebook/react/utils/Os.kt (98%) rename packages/gradle-plugin/{react-native-gradle-plugin => shared}/src/main/kotlin/com/facebook/react/utils/TaskUtils.kt (69%) rename packages/gradle-plugin/{react-native-gradle-plugin => shared}/src/test/kotlin/com/facebook/react/utils/KotlinStdlibCompatUtilsTest.kt (100%) rename packages/gradle-plugin/{react-native-gradle-plugin => shared}/src/test/kotlin/com/facebook/react/utils/OsTest.kt (100%) rename packages/gradle-plugin/{react-native-gradle-plugin => shared}/src/test/kotlin/com/facebook/react/utils/TaskUtilsTest.kt (100%) diff --git a/.circleci/configurations/jobs.yml b/.circleci/configurations/jobs.yml index 7b0604651e0..e9a60d74321 100644 --- a/.circleci/configurations/jobs.yml +++ b/.circleci/configurations/jobs.yml @@ -153,6 +153,7 @@ jobs: - packages/gradle-plugin/react-native-gradle-plugin/build/ - packages/gradle-plugin/settings-plugin/build/ - packages/gradle-plugin/shared/build/ + - packages/gradle-plugin/shared-testutil/build/ - packages/react-native-codegen/lib/ # ------------------------- diff --git a/packages/gradle-plugin/.gitignore b/packages/gradle-plugin/.gitignore index ffd4ff5e125..cff89e3edb9 100644 --- a/packages/gradle-plugin/.gitignore +++ b/packages/gradle-plugin/.gitignore @@ -2,3 +2,4 @@ build/ react-native-gradle-plugin/build/ settings-plugin/build/ shared/build/ +shared-testutil/build/ diff --git a/packages/gradle-plugin/react-native-gradle-plugin/build.gradle.kts b/packages/gradle-plugin/react-native-gradle-plugin/build.gradle.kts index d1c09716df8..28055c62092 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/build.gradle.kts +++ b/packages/gradle-plugin/react-native-gradle-plugin/build.gradle.kts @@ -48,6 +48,7 @@ dependencies { implementation(libs.javapoet) testImplementation(libs.junit) + testImplementation(project(":shared-testutil")) } // We intentionally don't build for Java 17 as users will see a cryptic bytecode version diff --git a/packages/gradle-plugin/settings-plugin/build.gradle.kts b/packages/gradle-plugin/settings-plugin/build.gradle.kts index 932cdb68fad..39b65d466cf 100644 --- a/packages/gradle-plugin/settings-plugin/build.gradle.kts +++ b/packages/gradle-plugin/settings-plugin/build.gradle.kts @@ -38,6 +38,7 @@ dependencies { implementation(libs.javapoet) testImplementation(libs.junit) + testImplementation(project(":shared-testutil")) } // We intentionally don't build for Java 17 as users will see a cryptic bytecode version diff --git a/packages/gradle-plugin/settings-plugin/src/main/kotlin/com/facebook/react/ReactSettingsExtension.kt b/packages/gradle-plugin/settings-plugin/src/main/kotlin/com/facebook/react/ReactSettingsExtension.kt index 6d4f60e6fb4..8f2f4476d6d 100644 --- a/packages/gradle-plugin/settings-plugin/src/main/kotlin/com/facebook/react/ReactSettingsExtension.kt +++ b/packages/gradle-plugin/settings-plugin/src/main/kotlin/com/facebook/react/ReactSettingsExtension.kt @@ -8,6 +8,7 @@ package com.facebook.react import com.facebook.react.utils.JsonUtils +import com.facebook.react.utils.windowsAwareCommandLine import java.io.File import java.math.BigInteger import java.security.MessageDigest @@ -25,6 +26,11 @@ abstract class ReactSettingsExtension @Inject constructor(val settings: Settings private val outputFolder = settings.layout.rootDirectory.file("build/generated/autolinking/").asFile + private val defaultConfigCommand: List = + windowsAwareCommandLine(listOf("npx", "@react-native-community/cli", "config")).map { + it.toString() + } + /** * Utility function to autolink libraries using an external command as source of truth. * @@ -39,7 +45,7 @@ abstract class ReactSettingsExtension @Inject constructor(val settings: Settings */ @JvmOverloads public fun autolinkLibrariesFromCommand( - command: List = listOf("npx", "@react-native-community/cli", "config"), + command: List = defaultConfigCommand, workingDirectory: File? = settings.layout.rootDirectory.dir("../").asFile, lockFiles: FileCollection = settings.layout.rootDirectory diff --git a/packages/gradle-plugin/settings.gradle.kts b/packages/gradle-plugin/settings.gradle.kts index bce34ba3a8b..b3c46a3bf5e 100644 --- a/packages/gradle-plugin/settings.gradle.kts +++ b/packages/gradle-plugin/settings.gradle.kts @@ -19,6 +19,7 @@ include( ":react-native-gradle-plugin", ":settings-plugin", ":shared", + ":shared-testutil", ) rootProject.name = "gradle-plugin-root" diff --git a/packages/gradle-plugin/shared-testutil/build.gradle.kts b/packages/gradle-plugin/shared-testutil/build.gradle.kts new file mode 100644 index 00000000000..41b2acbfdcd --- /dev/null +++ b/packages/gradle-plugin/shared-testutil/build.gradle.kts @@ -0,0 +1,38 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import org.gradle.api.tasks.testing.logging.TestExceptionFormat +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { alias(libs.plugins.kotlin.jvm) } + +repositories { mavenCentral() } + +group = "com.facebook.react" + +dependencies { implementation(libs.junit) } + +java { targetCompatibility = JavaVersion.VERSION_11 } + +kotlin { jvmToolchain(17) } + +tasks.withType().configureEach { + kotlinOptions { + apiVersion = "1.6" + jvmTarget = "11" + allWarningsAsErrors = true + } +} + +tasks.withType().configureEach { + testLogging { + exceptionFormat = TestExceptionFormat.FULL + showExceptions = true + showCauses = true + showStackTraces = true + } +} diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tests/OsRule.kt b/packages/gradle-plugin/shared-testutil/src/main/kotlin/com/facebook/react/tests/OsRule.kt similarity index 100% rename from packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tests/OsRule.kt rename to packages/gradle-plugin/shared-testutil/src/main/kotlin/com/facebook/react/tests/OsRule.kt diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tests/WithOs.kt b/packages/gradle-plugin/shared-testutil/src/main/kotlin/com/facebook/react/tests/WithOs.kt similarity index 100% rename from packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tests/WithOs.kt rename to packages/gradle-plugin/shared-testutil/src/main/kotlin/com/facebook/react/tests/WithOs.kt diff --git a/packages/gradle-plugin/shared/build.gradle.kts b/packages/gradle-plugin/shared/build.gradle.kts index bccaeb47e85..fa76599233e 100644 --- a/packages/gradle-plugin/shared/build.gradle.kts +++ b/packages/gradle-plugin/shared/build.gradle.kts @@ -18,6 +18,7 @@ dependencies { implementation(libs.gson) implementation(libs.guava) testImplementation(libs.junit) + testImplementation(project(":shared-testutil")) } java { targetCompatibility = JavaVersion.VERSION_11 } diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/KotlinStdlibCompatUtils.kt b/packages/gradle-plugin/shared/src/main/kotlin/com/facebook/react/utils/KotlinStdlibCompatUtils.kt similarity index 100% rename from packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/KotlinStdlibCompatUtils.kt rename to packages/gradle-plugin/shared/src/main/kotlin/com/facebook/react/utils/KotlinStdlibCompatUtils.kt diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/Os.kt b/packages/gradle-plugin/shared/src/main/kotlin/com/facebook/react/utils/Os.kt similarity index 98% rename from packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/Os.kt rename to packages/gradle-plugin/shared/src/main/kotlin/com/facebook/react/utils/Os.kt index e00a793ca86..a741fde8e43 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/Os.kt +++ b/packages/gradle-plugin/shared/src/main/kotlin/com/facebook/react/utils/Os.kt @@ -10,7 +10,7 @@ package com.facebook.react.utils import com.facebook.react.utils.KotlinStdlibCompatUtils.lowercaseCompat import java.io.File -internal object Os { +object Os { fun isWindows(): Boolean = System.getProperty("os.name")?.lowercaseCompat()?.contains("windows") ?: false diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/TaskUtils.kt b/packages/gradle-plugin/shared/src/main/kotlin/com/facebook/react/utils/TaskUtils.kt similarity index 69% rename from packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/TaskUtils.kt rename to packages/gradle-plugin/shared/src/main/kotlin/com/facebook/react/utils/TaskUtils.kt index df99d06e47b..ebb3185648a 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/TaskUtils.kt +++ b/packages/gradle-plugin/shared/src/main/kotlin/com/facebook/react/utils/TaskUtils.kt @@ -7,17 +7,16 @@ package com.facebook.react.utils -internal fun windowsAwareCommandLine(vararg args: Any): List = - windowsAwareCommandLine(args.toList()) +fun windowsAwareCommandLine(vararg args: Any): List = windowsAwareCommandLine(args.toList()) -internal fun windowsAwareCommandLine(args: List): List = +fun windowsAwareCommandLine(args: List): List = if (Os.isWindows()) { listOf("cmd", "/c") + args } else { args } -internal fun windowsAwareBashCommandLine( +fun windowsAwareBashCommandLine( vararg args: String, bashWindowsHome: String? = null ): List = diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/KotlinStdlibCompatUtilsTest.kt b/packages/gradle-plugin/shared/src/test/kotlin/com/facebook/react/utils/KotlinStdlibCompatUtilsTest.kt similarity index 100% rename from packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/KotlinStdlibCompatUtilsTest.kt rename to packages/gradle-plugin/shared/src/test/kotlin/com/facebook/react/utils/KotlinStdlibCompatUtilsTest.kt diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/OsTest.kt b/packages/gradle-plugin/shared/src/test/kotlin/com/facebook/react/utils/OsTest.kt similarity index 100% rename from packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/OsTest.kt rename to packages/gradle-plugin/shared/src/test/kotlin/com/facebook/react/utils/OsTest.kt diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/TaskUtilsTest.kt b/packages/gradle-plugin/shared/src/test/kotlin/com/facebook/react/utils/TaskUtilsTest.kt similarity index 100% rename from packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/TaskUtilsTest.kt rename to packages/gradle-plugin/shared/src/test/kotlin/com/facebook/react/utils/TaskUtilsTest.kt