focus-flow/scripts/dev.dart

84 lines
2.1 KiB
Dart

/// Runs the Dev workspace script.
library;
import 'dart:io';
import 'package:scheduler_backup/backup.dart';
/// Starts local code generation and a Flutter desktop dev session.
Future<void> main(List<String> arguments) async {
final sqlitePath =
_option(arguments, '--sqlite') ?? defaultSchedulerSqliteFile().path;
final device = _option(arguments, '--device') ?? _defaultDesktopDevice();
stdout.writeln('SQLite path: $sqlitePath');
final buildRunner = await _start(
'dart',
<String>[
'run',
'build_runner',
'watch',
'--delete-conflicting-outputs',
],
);
stdout.writeln('Started build_runner watch (pid ${buildRunner.pid}).');
_watchForExit(ProcessSignal.sigint, 130, buildRunner);
if (!Platform.isWindows) {
_watchForExit(ProcessSignal.sigterm, 143, buildRunner);
}
try {
final flutter = await _start(
'flutter',
<String>[
'run',
'-d',
device,
'--dart-define=SCHEDULER_SQLITE_PATH=$sqlitePath',
],
);
stdout.writeln(
'Started Flutter desktop with hot reload (pid ${flutter.pid}).');
exitCode = await flutter.exitCode;
} finally {
buildRunner.kill();
}
}
void _watchForExit(ProcessSignal signal, int code, Process buildRunner) {
signal.watch().listen((_) {
buildRunner.kill();
exit(code);
});
}
Future<Process> _start(String executable, List<String> arguments) async {
stdout.writeln('> $executable ${arguments.join(' ')}');
try {
return Process.start(
executable,
arguments,
mode: ProcessStartMode.inheritStdio,
runInShell: Platform.isWindows,
);
} on ProcessException catch (error) {
stderr.writeln(error.message);
stderr.writeln('Unable to start: $executable');
rethrow;
}
}
String _defaultDesktopDevice() {
if (Platform.isMacOS) return 'macos';
if (Platform.isWindows) return 'windows';
return 'linux';
}
String? _option(List<String> arguments, String name) {
final index = arguments.indexOf(name);
if (index == -1 || index + 1 >= arguments.length) {
return null;
}
return arguments[index + 1];
}