Future build()

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);
  }