loadExtensionProject function
Future<ExtensionProject?>
loadExtensionProject(
- JbFiles files,
- JbActors actors,
- Options options,
- JbConfigWithImports cwi,
- 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);
}