diff --git a/packages/cli-platform-android/README.md b/packages/cli-platform-android/README.md index d2b324b44..59e2389b0 100644 --- a/packages/cli-platform-android/README.md +++ b/packages/cli-platform-android/README.md @@ -95,6 +95,14 @@ Build native libraries only for the current device architecture for debug builds List all available Android devices and simulators and let you choose one to run the app. + +#### `--interactive` + +Manually select a task and device/simulator you want to run your app on. + +> [!WARNING] +> This flag is running `./gradlew tasks` under the hood, which might take some time for more complex apps. If that affects your project, consider using `--mode` and `--deviceId` flags instead. + ### `build-android` Usage: diff --git a/packages/cli-platform-android/src/commands/buildAndroid/index.ts b/packages/cli-platform-android/src/commands/buildAndroid/index.ts index db307ff7f..2873a92fe 100644 --- a/packages/cli-platform-android/src/commands/buildAndroid/index.ts +++ b/packages/cli-platform-android/src/commands/buildAndroid/index.ts @@ -92,7 +92,6 @@ async function buildAndroid( args.mode || args.variant, tasks, 'bundle', - androidProject.sourceDir, ); if (args.extraParams) { diff --git a/packages/cli-platform-android/src/commands/runAndroid/getTaskNames.ts b/packages/cli-platform-android/src/commands/runAndroid/getTaskNames.ts index 26b71dac4..23c022977 100644 --- a/packages/cli-platform-android/src/commands/runAndroid/getTaskNames.ts +++ b/packages/cli-platform-android/src/commands/runAndroid/getTaskNames.ts @@ -1,47 +1,15 @@ import {toPascalCase} from './toPascalCase'; import type {BuildFlags} from '../buildAndroid'; -import {getGradleTasks} from './listAndroidTasks'; -import {CLIError, logger} from '@react-native-community/cli-tools'; export function getTaskNames( appName: string, mode: BuildFlags['mode'] = 'debug', tasks: BuildFlags['tasks'], taskPrefix: 'assemble' | 'install' | 'bundle', - sourceDir: string, ): Array { - let appTasks = + const appTasks = tasks && tasks.length ? tasks : [taskPrefix + toPascalCase(mode)]; - // Check against build flavors for "install" task ("assemble" don't care about it so much and will build all) - if (!tasks?.length && taskPrefix === 'install') { - const actionableInstallTasks = getGradleTasks('install', sourceDir); - if (!actionableInstallTasks.find((t) => t.task.includes(appTasks[0]))) { - const installTasksForMode = actionableInstallTasks.filter((t) => - t.task.toLowerCase().includes(mode), - ); - if (!installTasksForMode.length) { - throw new CLIError( - `Couldn't find "${appTasks - .map((taskName) => taskName.replace(taskPrefix, '')) - .join( - ', ', - )}" build variant. Available variants are: ${actionableInstallTasks - .map((t) => `"${t.task.replace(taskPrefix, '')}"`) - .join(', ')}.`, - ); - } - logger.warn( - `Found multiple tasks for "install" command: ${installTasksForMode - .map((t) => t.task) - .join(', ')}.\nSelecting first available: ${ - installTasksForMode[0].task - }.`, - ); - appTasks = [installTasksForMode[0].task]; - } - } - return appName ? appTasks.map((command) => `${appName}:${command}`) : appTasks; diff --git a/packages/cli-platform-android/src/commands/runAndroid/index.ts b/packages/cli-platform-android/src/commands/runAndroid/index.ts index a269cb555..9a9b3d87a 100644 --- a/packages/cli-platform-android/src/commands/runAndroid/index.ts +++ b/packages/cli-platform-android/src/commands/runAndroid/index.ts @@ -191,7 +191,6 @@ function runOnSpecificDevice( args.mode || args.variant, args.tasks ?? buildTask, 'install', - androidProject.sourceDir, ); // using '-x lint' in order to ignore linting errors while building the apk diff --git a/packages/cli-platform-android/src/commands/runAndroid/listAndroidTasks.ts b/packages/cli-platform-android/src/commands/runAndroid/listAndroidTasks.ts index c22d24f40..731d71f16 100644 --- a/packages/cli-platform-android/src/commands/runAndroid/listAndroidTasks.ts +++ b/packages/cli-platform-android/src/commands/runAndroid/listAndroidTasks.ts @@ -1,4 +1,4 @@ -import {CLIError} from '@react-native-community/cli-tools'; +import {CLIError, getLoader} from '@react-native-community/cli-tools'; import chalk from 'chalk'; import execa from 'execa'; import prompts from 'prompts'; @@ -32,12 +32,19 @@ export const getGradleTasks = ( taskType: 'install' | 'build', sourceDir: string, ) => { + const loader = getLoader(); + loader.start('Searching for available Gradle tasks...'); const cmd = process.platform.startsWith('win') ? 'gradlew.bat' : './gradlew'; - - const out = execa.sync(cmd, ['tasks', '--group', taskType], { - cwd: sourceDir, - }).stdout; - return parseTasksFromGradleFile(taskType, out); + try { + const out = execa.sync(cmd, ['tasks', '--group', taskType], { + cwd: sourceDir, + }).stdout; + loader.succeed(); + return parseTasksFromGradleFile(taskType, out); + } catch { + loader.fail(); + return []; + } }; export const promptForTaskSelection = async ( diff --git a/packages/cli-platform-android/src/commands/runAndroid/runOnAllDevices.ts b/packages/cli-platform-android/src/commands/runAndroid/runOnAllDevices.ts index 70e61da8c..15faba2d5 100644 --- a/packages/cli-platform-android/src/commands/runAndroid/runOnAllDevices.ts +++ b/packages/cli-platform-android/src/commands/runAndroid/runOnAllDevices.ts @@ -59,7 +59,6 @@ async function runOnAllDevices( args.mode || args.variant, args.tasks, 'install', - androidProject.sourceDir, ); if (args.extraParams) {