@@ -7,6 +7,7 @@ import 'dart:io';
7
7
import 'dart:isolate' ;
8
8
9
9
import 'package:args/command_runner.dart' ;
10
+ import 'package:stack_trace/stack_trace.dart' ;
10
11
11
12
/// Extend to get a command with the arguments common to all build_runner
12
13
/// commands.
@@ -26,10 +27,41 @@ abstract class BuildRunnerCommandBase extends Command {
26
27
27
28
Future runCore (String command) async {
28
29
final arguments = [command]..addAll (argResults.arguments);
30
+
31
+ // Heavily inspired by dart-lang/build @ 0c77443dd7
32
+ // /build_runner/bin/build_runner.dart#L58-L85
29
33
var exitPort = new ReceivePort ();
30
- await Isolate .spawnUri (await _buildRunnerScript (), arguments, null ,
31
- onExit: exitPort.sendPort, automaticPackageResolution: true );
34
+ var errorPort = new ReceivePort ();
35
+ var messagePort = new ReceivePort ();
36
+ var errorListener = errorPort.listen ((e) {
37
+ stderr.writeln ('\n\n You have hit a bug in build_runner' );
38
+ stderr.writeln ('Please file an issue with reproduction steps at '
39
+ 'https://github.com/dart-lang/build/issues\n\n ' );
40
+ final error = e[0 ];
41
+ final trace = e[1 ] as String ;
42
+ stderr.writeln (error);
43
+ stderr.writeln (new Trace .parse (trace).terse);
44
+ if (exitCode == 0 ) exitCode = 1 ;
45
+ });
46
+ await Isolate .spawnUri (
47
+ await _buildRunnerScript (), arguments, messagePort.sendPort,
48
+ onExit: exitPort.sendPort,
49
+ onError: errorPort.sendPort,
50
+ automaticPackageResolution: true );
51
+ StreamSubscription exitCodeListener;
52
+ exitCodeListener = messagePort.listen ((isolateExitCode) {
53
+ if (isolateExitCode is ! int ) {
54
+ throw new StateError (
55
+ 'Bad response from isolate, expected an exit code but got '
56
+ '$isolateExitCode ' );
57
+ }
58
+ exitCode = isolateExitCode as int ;
59
+ exitCodeListener.cancel ();
60
+ exitCodeListener = null ;
61
+ });
32
62
await exitPort.first;
63
+ await errorListener.cancel ();
64
+ await exitCodeListener? .cancel ();
33
65
}
34
66
}
35
67
0 commit comments