loadExtensionProject function

Future<ExtensionProject?> loadExtensionProject(
  1. JbFiles files,
  2. JbActors actors,
  3. Options options,
  4. JbConfigWithImports cwi,
  5. DartleCache cache,
)

Load an extension project from the given projectPath, if given, or from the default location otherwise.

Implementation

Future<ExtensionProject?> loadExtensionProject(
  JbFiles files,
  JbActors actors,
  Options options,
  JbConfigWithImports cwi,
  DartleCache cache,
) async {
  final extensionProjectPath = cwi.config.extensionProject;
  final stopWatch = Stopwatch()..start();
  final projectDir = Directory(extensionProjectPath ?? jbExtension);
  if (!await projectDir.exists()) {
    if (extensionProjectPath != null) {
      failBuild(
        reason: 'Extension project does not exist: $extensionProjectPath',
      );
    }
    logger.finer('No extension project.');
    return null;
  }

  final rootDir = projectDir.path;
  logger.info(
    () => '========= Loading jb extension project: $rootDir =========',
  );

  final extensionCwi = await withCurrentDirectory(rootDir, () async {
    return await defaultJbConfigSource.load();
  }, onError: changedDirectoryOnError(rootDir));
  _verifyJBuildApiDependency(extensionCwi.config);

  final configContainer = await withCurrentDirectory(
    rootDir,
    onError: changedDirectoryOnError(rootDir),
    () => JbConfigContainer(cwi),
  );
  final runner = JbRunner(files, extensionCwi, actors);

  // run the extension project's compile task so that its
  // jb tasks can be executed later
  final extensionProjectTasks = await withCurrentDirectory(
    rootDir,
    onError: changedDirectoryOnError(rootDir),
    () async => await runner.run(
      options.copy(
        tasksInvocation: const [compileTaskName, installRuntimeDepsTaskName],
      ),
      isRoot: false,
    ),
  );

  logger.fine(() => "Extension project '$rootDir' initialized");

  final absRootDir = p.canonicalize(rootDir);
  final classpath = await _toClasspath(rootDir, configContainer);

  final extensionModel = await createJbExtensionModel(
    configContainer,
    rootDir,
    classpath,
    cache,
    actors.jvmExecutor.takingJavaCommands(),
    extensionUpToDate: extensionProjectTasks.every((t) => t.mustRunCount == 0),
  );

  _warnOnUnexpectedConfig(extensionModel, cwi.config.extras);

  // convert the [ExtensionTask]s and constructor data into Dartle [Task]s
  final tasks = extensionModel.extensionTasks
      .map((extensionTask) {
        return _createTask(
          actors.jvmExecutor.takingJavaCommands(),
          classpath,
          extensionTask,
          absRootDir,
          cache,
        );
      })
      .toList(growable: false);

  logger.log(
    profile,
    () => 'Loaded jb extension project in ${elapsedTime(stopWatch)}',
  );
  logger.info('========= jb extension loaded =========');

  return ExtensionProject(rootDir, absRootDir, extensionModel, tasks);
}