package method

Future<List<MakeResult>> package(
  1. String platform,
  2. List<String> targets, {
  3. String? channel,
  4. String? artifactName,
  5. required bool cleanBeforeBuild,
  6. required Map<String, dynamic> buildArguments,
  7. Map<String, String>? variables,
})
inherited

Package an application for a specific platform and target

Implementation

Future<List<MakeResult>> package(
  String platform,
  List<String> targets, {
  String? channel,
  String? artifactName,
  required bool cleanBeforeBuild,
  required Map<String, dynamic> buildArguments,
  Map<String, String>? variables,
}) async {
  List<MakeResult> makeResultList = [];

  try {
    Directory outputDirectory = distributeOptions.outputDirectory;
    if (!outputDirectory.existsSync()) {
      outputDirectory.createSync(recursive: true);
    }

    if (cleanBeforeBuild) {
      await _builder.clean();
    }

    bool isBuildOnlyOnce = platform != 'android';
    BuildResult? buildResult;

    for (String target in targets) {
      logger.info('Packaging ${pubspec.name} ${pubspec.version} as $target:');
      if (!isBuildOnlyOnce || (isBuildOnlyOnce && buildResult == null)) {
        try {
          buildResult = await _builder.build(
            platform,
            target: target,
            arguments: buildArguments,
            environment: variables ?? globalVariables,
          );
          print(
            const JsonEncoder.withIndent('  ').convert(buildResult.toJson()),
          );
          logger.info(
            'Successfully built ${buildResult.outputDirectory} in ${buildResult.duration!.inSeconds}s'
                .brightGreen(),
          );
        } on UnsupportedError catch (error) {
          logger.warning('Warning: ${error.message}'.yellow());
          continue;
        } catch (error) {
          rethrow;
        }
      }

      if (buildResult != null) {
        String buildMode =
            buildArguments.containsKey('profile') ? 'profile' : 'release';
        Map<String, dynamic>? arguments = {
          'build_mode': buildMode,
          'flavor': buildArguments['flavor'],
          'channel': channel,
          'artifact_name': artifactName,
        };
        MakeResult makeResult = await _packager.package(
          platform,
          target,
          arguments,
          outputDirectory,
          buildOutputDirectory: buildResult.outputDirectory,
          buildOutputFiles: buildResult.outputFiles,
        );
        print(
          const JsonEncoder.withIndent('  ').convert(makeResult.toJson()),
        );
        FileSystemEntity artifact = makeResult.artifacts.first;
        logger.info(
          'Successfully packaged ${artifact.path}'.brightGreen(),
        );
        makeResultList.add(makeResult);
      }
    }
  } catch (error) {
    logger.severe(error.toString().red());
    if (error is Error) {
      logger.severe(error.stackTrace.toString().red());
    }
    rethrow;
  }

  return makeResultList;
}