resolve method
Future<SourceBuildResult?>
resolve({
- required SourceFallback fallback,
- required Directory packageRoot,
- required Directory sourceCacheRoot,
- required BuildInput input,
- required BuildOutputBuilder output,
- required Logger? logger,
Resolve, prepare, and build from source.
Returns the directory containing the built library, or null
if no source could be resolved.
Implementation
Future<SourceBuildResult?> resolve({
required SourceFallback fallback,
required Directory packageRoot,
required Directory sourceCacheRoot,
required BuildInput input,
required BuildOutputBuilder output,
required Logger? logger,
}) async {
// Try each source specification with each provider.
ResolvedSource? resolved;
for (final spec in fallback.sources) {
final specContext = SourceResolutionContext(
specification: spec,
packageRoot: packageRoot,
sourceCacheRoot: sourceCacheRoot,
);
for (final provider in providers) {
try {
resolved = await provider.resolve(specContext);
if (resolved != null) break;
} catch (e) {
logger?.warning('Source provider ${provider.runtimeType} failed: $e');
continue;
}
}
if (resolved != null) break;
}
if (resolved == null) {
logger?.warning(
'No source resolved from ${fallback.sources.length} specifications',
);
return null;
}
logger?.info(
'Resolved source: ${resolved.origin.label} at ${resolved.directory.path}',
);
// Apply preparation steps.
// Work in a copy of the resolved source to keep the cache immutable.
final workDir = await _prepareWorkingDirectory(
resolved,
sourceCacheRoot,
logger,
);
try {
for (final step in fallback.preparation) {
await step.apply(directory: workDir, logger: logger);
}
// Build.
await fallback.builder.build(
source: ResolvedSource(
directory: workDir,
origin: resolved.origin,
revision: resolved.revision,
),
input: input,
output: output,
logger: logger,
);
return SourceBuildResult(
source: ResolvedSource(
directory: workDir,
origin: resolved.origin,
revision: resolved.revision,
),
workDirectory: workDir,
);
} catch (e) {
logger?.severe('Source build failed: $e');
rethrow;
}
}