start method

Future<void> start()

Implementation

Future<void> start() async {
  if (isRunning) {
    _log("$rootPath build_runner already running with pid $pid");
    return;
  }

  final packageName = _readPackageName();
  if (!_hasBuildRunnerDependency()) {
    _log("$packageName does not depend on build_runner; skipping startup");
    return;
  }

  final logFile = await _createLogFile();
  _logSink = logFile.openWrite(mode: .writeOnly);
  _writeLog("Starting build_runner for $packageName in $rootPath");

  final isWorkspace = await _isDartWorkspace();

  try {
    final args = [
      ...switch (isWorkspace) {
        true => _watchWorkspaceArgs,
        false => _watchArgs,
      },
      for (final filter in buildFilters) '--build-filter=$filter',
    ];

    final process = await io.Process.start(
      "dart",
      args,
      workingDirectory: rootPath,
    );

    _process = process;
    _onStarted(this, process.pid);
    _writeLog("Started build_runner with pid ${process.pid}");

    _stdoutSubscription = _lineStream(process.stdout).listen(
      (line) => _writeLog("[stdout] $line"),
      onError: (Object error, StackTrace stackTrace) {
        _writeLog("[stdout:error] $error");
      },
    );
    _stderrSubscription = _lineStream(process.stderr).listen(
      (line) => _writeLog("[stderr] $line"),
      onError: (Object error, StackTrace stackTrace) {
        _writeLog("[stderr:error] $error");
      },
    );

    unawaited(_watchExit(process));
  } catch (error, stackTrace) {
    _writeLog("Failed to start build_runner: $error");
    _writeLog(stackTrace.toString());
  }
}