build method

Future<int> build({
  1. List<String> androidArgs = const [],
  2. List<String> iosArgs = const [],
  3. Map<String, List<String>>? customBuildArgs,
})

Builds the app for the specified platforms and arguments.

Implementation

Future<int> build({
  List<String> androidArgs = const [],
  List<String> iosArgs = const [],
  Map<String, List<String>>? customBuildArgs,
}) async {
  customBuildArgs ??= {};
  int exitCode = 0;

  if (buildAndroid) customBuildArgs['android'] = androidArgs;
  if (buildIOS) customBuildArgs['ios'] = iosArgs;

  List<(String, int)> buildResults = [];

  for (final entry in customBuildArgs.entries) {
    final platform = entry.key;
    final args = entry.value;
    if (platform == 'android') {
      buildResults.add(await _buildAndroid(args: args).then((value) {
        if (value == 0) {
          logger.logInfo('Android build success.');
        } else {
          logger.logError('Android build failed.');
        }
        return (platform, value);
      }).catchError((e) {
        logger.logError('An error occurred: $e');
        return (platform, 1);
      }));
    } else if (platform == 'ios') {
      buildResults.add(await _buildIOS(args: args).then((value) {
        if (value == 0) {
          logger.logInfo('iOS build success.');
        } else {
          logger.logError('iOS build failed.');
        }
        return (platform, value);
      }).catchError((e) => (platform, 1)));
    } else {
      buildResults.add(await _buildCustom(platform, args).then((value) {
        if (value == 0) {
          logger.logInfo('$platform build success.');
        } else {
          logger.logError('$platform build failed.');
        }
        return (platform, value);
      }).catchError((e) => (platform, 1)));
    }
  }

  if (publish) {
    List<(String, int)> distributionResults = [];
    for (var buildResult in buildResults) {
      stdout.writeln("Build result ${buildResult.$1} ${buildResult.$2}");
      if (buildAndroid &&
          buildResult.$1 == "android" &&
          buildResult.$2 == 0) {
        if (environment.distributionInitResult!.git) {
          await publisher.buildAndroidDocs();
        }
        distributionResults.add(await publisher
            .distributeAndroid()
            .then((value) => (buildResult.$1, value))
            .catchError((e) => (buildResult.$1, 1)));
      }
      if (buildIOS && buildResult.$1 == "ios" && buildResult.$2 == 0) {
        distributionResults.add(await publisher
            .distributeIOS()
            .then((value) => (buildResult.$1, value))
            .catchError((e) => (buildResult.$1, 1)));
      }
    }

    if (distributionResults.isNotEmpty) {
      for (var result in distributionResults) {
        if (result.$2 != 0) {
          logger.logError('Distribution failed for ${result.$1}.');
          exitCode = 1;
        } else {
          logger.logSuccess(
              'Distribution completed successfully for ${result.$1}.');
        }
      }
    } else {
      logger.logInfo('No distribution tasks to execute.');
    }
  }

  exit(exitCode);
}