execute method

Future execute()

Implementation

Future execute() async {
  final compilers = context.context.compilers;

  print("Resolving ASTs...");
  final astsToResolve = <Uri>{
    ...compilers.expand((c) => c.getUrisToResolve(context))
  };
  await Future.forEach<Uri>(
    astsToResolve,
    (astUri) async {
      Uri package =
          (await context.getPackageFromUri(astUri))?.packageUriRoot ?? astUri;
      return context.analyzer.resolveUnitOrLibraryAt(package);
    },
  );

  print("Generating runtime...");

  final runtimeGenerator = RuntimeGenerator();
  for (MapEntry entry in context.context.runtimes.map.entries) {
    if (entry.value is SourceCompiler) {
      await entry.value.compile(context).then((source) =>
          runtimeGenerator.addRuntime(name: entry.key, source: source));
    }
  }

  await runtimeGenerator.writeTo(context.buildRuntimeDirectory.uri);
  print("Generated runtime at '${context.buildRuntimeDirectory.uri}'.");

  final nameOfPackageBeingCompiled = context.sourceApplicationPubspec.name;
  final pubspecMap = <String, dynamic>{
    'name': 'runtime_target',
    'version': '1.0.0',
    'environment': {'sdk': '>=2.12.0 <3.0.0'},
    'dependency_overrides': {}
  };
  final overrides = pubspecMap['dependency_overrides'] as Map;
  var sourcePackageIsCompiled = false;

  for (final compiler in compilers) {
    final packageInfo = await _getPackageInfoForCompiler(compiler);
    final sourceDirUri = packageInfo.root;
    final targetDirUri =
        context.buildPackagesDirectory.uri.resolve("${packageInfo.name}/");
    print("Compiling package '${packageInfo.name}'...");
    copyPackage(sourceDirUri, targetDirUri);
    compiler.deflectPackage(Directory.fromUri(targetDirUri));

    if (packageInfo.name != nameOfPackageBeingCompiled) {
      overrides[packageInfo.name] = {
        "path": targetDirUri.toFilePath(windows: Platform.isWindows)
      };
    } else {
      sourcePackageIsCompiled = true;
    }
    print("Package '${packageInfo.name}' compiled to '$targetDirUri'.");
  }

  final appDst = context.buildApplicationDirectory.uri;
  if (!sourcePackageIsCompiled) {
    print(
        "Copying application package (from '${context.sourceApplicationDirectory.uri}')...");
    copyPackage(context.sourceApplicationDirectory.uri, appDst);
    print("Application packaged copied to '$appDst'.");
  }
  pubspecMap['dependencies'] = {
    nameOfPackageBeingCompiled: {
      "path": appDst.toFilePath(windows: Platform.isWindows)
    }
  };

  if (context.forTests) {
    final devDeps = context.sourceApplicationPubspecMap['dev_dependencies'];
    if (devDeps != null) {
      pubspecMap['dev_dependencies'] = devDeps;
    }

    overrides['tridev'] = {
      'path': appDst.toFilePath(windows: Platform.isWindows)
    };
  }

  File.fromUri(context.buildDirectoryUri.resolve("pubspec.yaml"))
      .writeAsStringSync(json.encode(pubspecMap));

  context
      .getFile(context.targetScriptFileUri)
      .writeAsStringSync(context.source);

  for (final compiler in context.context.compilers) {
    compiler.didFinishPackageGeneration(context);
  }

  print("Fetching dependencies (--offline --no-precompile)...");
  await getDependencies();
  print("Finished fetching dependencies.");

  if (!context.forTests) {
    print("Compiling...");
    await compile(context.targetScriptFileUri, context.executableUri);
    print("Success. Executable is located at '${context.executableUri}'.");
  }
}