run method

  1. @override
Future? run()
override

Executes the initialization command to set up the project.

This method performs the following tasks:

  • Creates necessary distribution directories
  • Validates required development tools
  • Sets up platform-specific configurations
  • Generates initial configuration files
  • Downloads metadata for Android publishing

The initialization process includes:

  • Directory structure creation for Android and iOS (macOS only)
  • Tool validation for Flutter, Firebase, Git, Fastlane, and compression tools
  • Fastlane configuration setup
  • Google Play Console metadata download

Implementation

@override
Future? run() async {
  final initialized = <String, bool>{};
  String configFilePath =
      globalResults?['config'] as String? ?? 'distribution.yaml';
  _logWelcome();
  _checkPubspecFile();
  await _createDirectory(
    path.join("distribution", "android", "output"),
    initialized,
    "android_directory",
  );
  if (Platform.isMacOS) {
    await _createDirectory(
      path.join("distribution", "ios", "output"),
      initialized,
      "ios_directory",
    );
  }

  if (!(argResults!['skip-tools'] as bool)) {
    await _checkTool(
      "flutter",
      "Flutter",
      initialized,
      args: ['--version'],
    ).catchError((_) => -1);
    await _checkTool(
      "firebase",
      "Firebase",
      initialized,
    ).catchError((_) => -1);
    await _checkTool(
      "git",
      "Git",
      initialized,
      args: ['--version'],
    ).catchError((_) => -1);

    await CompressFiles.checkTools().then((value) {
      if (!value) {
        logger.logWarning(
          "Compress tool is not installed, some features may not work as expected.",
        );
      } else {
        logger.logSuccess('Compress tool is installed.');
        initialized["compress_tool"] = true;
      }
    });

    await _checkTool(
      "fastlane",
      "Fastlane",
      initialized,
      args: ['actions'],
    ).catchError((_) => -1).then((value) async {
      if (value == 0) {
        await _validateFastlaneJson(initialized).then((value) async {
          if (value == 0) return await _downloadAndroidMetaData();
        });
      } else {
        if (Platform.isWindows) {
          logger.logWarning(
            'Tips : In Windows, you can install fastlane using "gem install fastlane", make sure you have Ruby installed.',
          );
        } else if (Platform.isLinux) {
          logger.logWarning(
            'Tips : In Linux, you can install fastlane using "sudo gem install fastlane", make sure you have Ruby installed.',
          );
        } else if (Platform.isMacOS) {
          logger.logWarning(
            'Tips : In MacOS, you can install fastlane using "sudo gem install fastlane", make sure you have Ruby installed.',
          );
        }
        initialized["fastlane_json"] = false;
      }
    });
    if (Platform.isMacOS) {
      await _checkTool(
        "xcrun",
        "XCRun",
        initialized,
        args: ["altool", "-h"],
      ).catchError((_) => -1);
    }
  }

  final yaml = File(configFilePath);
  if (!yaml.existsSync()) {
    yaml.writeAsString(yamlEncode(structures), flush: true);
  }

  return;
}