in build_runner/lib/src/daemon/daemon_builder.dart [69:144]
Future<void> build(
Set<BuildTarget> targets, Iterable<WatchEvent> fileChanges) async {
var defaultTargets = targets.cast<DefaultBuildTarget>();
var changes = fileChanges
.map<AssetChange>(
(change) => AssetChange(AssetId.parse(change.path), change.type))
.toList();
if (!_buildOptions.skipBuildScriptCheck &&
_builder.buildScriptUpdates!.hasBeenUpdated(
changes.map<AssetId>((change) => change.id).toSet())) {
if (!_buildScriptUpdateCompleter.isCompleted) {
_buildScriptUpdateCompleter.complete();
}
return;
}
var targetNames = targets.map((t) => t.target).toSet();
_logMessage(Level.INFO, 'About to build ${targetNames.toList()}...');
_signalStart(targetNames);
var results = <BuildResult>[];
var buildDirs = <BuildDirectory>{};
var buildFilters = <BuildFilter>{};
for (var target in defaultTargets) {
OutputLocation? outputLocation;
if (target.outputLocation != null) {
final targetOutputLocation = target.outputLocation!;
outputLocation = OutputLocation(targetOutputLocation.output,
useSymlinks: targetOutputLocation.useSymlinks,
hoist: targetOutputLocation.hoist);
}
buildDirs
.add(BuildDirectory(target.target, outputLocation: outputLocation));
if (target.buildFilters != null && target.buildFilters!.isNotEmpty) {
buildFilters.addAll([
for (var pattern in target.buildFilters!)
BuildFilter.fromArg(pattern, _buildOptions.packageGraph.root.name)
]);
} else {
buildFilters
..add(BuildFilter.fromArg(
'package:*/**', _buildOptions.packageGraph.root.name))
..add(BuildFilter.fromArg(
'${target.target}/**', _buildOptions.packageGraph.root.name));
}
}
try {
var mergedChanges = collectChanges([changes]);
var result = await _builder.run(mergedChanges,
buildDirs: buildDirs, buildFilters: buildFilters);
for (var target in targets) {
if (result.status == core.BuildStatus.success) {
// TODO(grouma) - Can we notify if a target was cached?
results.add(DefaultBuildResult((b) => b
..status = BuildStatus.succeeded
..target = target.target));
} else {
results.add(DefaultBuildResult((b) => b
..status = BuildStatus.failed
// TODO(grouma) - We should forward the error messages instead.
// We can use the AssetGraph and FailureReporter to provide a better
// error message.
..error = 'FailureType: ${result.failureType?.exitCode}'
..target = target.target));
}
}
} catch (e) {
for (var target in targets) {
results.add(DefaultBuildResult((b) => b
..status = BuildStatus.failed
..error = '$e'
..target = target.target));
}
_logMessage(Level.SEVERE, 'Build Failed:\n${e.toString()}');
}
_signalEnd(results);
}