Script constructor

Script(
  1. String executableAndArgs, {
  2. Iterable<String>? args,
  3. String? name,
  4. String? workingDirectory,
  5. Map<String, String>? environment,
  6. bool includeParentEnvironment = true,
  7. bool runInShell = false,
})

Creates a Script that runs a subprocess.

The executableAndArgs and args arguments are parsed as described in the README. The name is a human-readable identifier for this script that's used in debugging and error reporting, and defaults to the executable name. All other arguments are forwarded to Process.start.

Implementation

factory Script(String executableAndArgs,
    {Iterable<String>? args,
    String? name,
    String? workingDirectory,
    Map<String, String>? environment,
    bool includeParentEnvironment = true,
    bool runInShell = false}) {
  var parsedExecutableAndArgs = CliArguments.parse(executableAndArgs);

  name ??= p.basename(parsedExecutableAndArgs.executable);
  ProcessSignal? capturedSignal;
  Process? process;
  return Script.fromComponentsInternal(name, () async {
    if (includeParentEnvironment) {
      environment = environment == null
          ? env
          // Use [withEnv] to ensure that the copied environment correctly
          // overrides the parent [env], including handling case-insensitive
          // keys on Windows.
          : withEnv(() => env, environment!);
    }

    var allArgs = [
      ...await parsedExecutableAndArgs.arguments(root: workingDirectory),
      ...?args
    ];

    if (inDebugMode) {
      // dart-lang/language#1536
      debug("[${name!}] ${parsedExecutableAndArgs.executable} "
          "${allArgs.join(' ')}");
    }

    process = await Process.start(parsedExecutableAndArgs.executable, allArgs,
        workingDirectory: workingDirectory,
        environment: environment,
        includeParentEnvironment: false,
        runInShell: runInShell);

    // Passes the [capturedSignal] received by the [Script.kill] function to
    // the [Process.kill] function if the signal was received before the
    // process started.
    if (capturedSignal != null) process!.kill(capturedSignal!);

    return ScriptComponents(
        process!.stdin, process!.stdout, process!.stderr, process!.exitCode);
  }, (signal) {
    if (process != null) return process!.kill(signal);
    capturedSignal = signal;
    return true;
  }, silenceStartMessage: true);
}