Script constructor
Script(})
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);
}