dart でコマンドラインを実行するパッケージ(run)を作成しました。
とりあえず、デモ用のソースを提示しておきます(dart-sdk-3.7.2 と dart-sdk-3.9.0-14.0.dev で動作を確認しました。また flutter windows desktop でも動作しました(flutter-sdk-3.29.3))。
残念ながら、flutter web では使えません。
また、Windows で var shell = Run(useUnixShell: true);
を使うには、git for windows の bash プロンプトなどで dart を実行してください。useUnixShell: true
を指定しない場合は、Windows のコマンドプロンプトで実行できるコマンドが使えます。
run
Wrapper over dart:io
[Process] API's that supports features like environment management, user switches, and more.
Useful for writing shell utility scripts in Dart, or within applications that perform system administration tasks on behalf of other users.
import 'dart:io';
import 'package:run/run.dart';
main() async {
var shell = Run(useUnixShell: true);
// コマンドを実行した際の標準出力を簡単に取得することができます。
// `silent: true' の指定をしないと, メソッドの結果として返されるにもかかわらず、stdout が自動的に表示されます。
String echo = await shell.run('echo hello world', silent: true);
print(echo);
// コマンドの終了コード(exit code)を取得することもできます。
//
// `returnCode: true' を使えば、プロセスの終了コードを取得できます。
//
// 指定しない場合は、上記のように標準出力を返しますが、終了コード 0 以外では例外が投げられます。
int find = await shell.run$(['find', '.', '-name', '"*.dart"'], autoQuote: false, returnCode: true);
print(find);
if (find != 0) {
exit(find);
}
// `silent: true' の指定をしていないので、pwd のコンソールへの出力は抑制されません。
// print()文は余計ですね。
String pwd = await shell.run('pwd');
print('cwd: `$pwd`');
Directory.current = './lib';
pwd = await shell.run('pwd');
print('cwd: `$pwd`');
// `useUnixShell: true' を指定して Run() をコンストラクトした場合はコマンド来の中で | を使うことができます。
String find2 = await shell.run(
'find . -name "*.dart" | wc -l',
);
print(find2);
// `useUnixShell: true' を指定して Run() をコンストラクトした場合はコマンド来の中で | を使うことができます。
// run$() は、引数を全部クォートしてしまうので、パイプ(|)を使うためには、`autoQuote: false' の指定が必要になります。
String find3 = await shell.run$(
['find', '.', '-name', '"*.dart"', '|', 'wc', '-l'],
autoQuote: false
);
print(find3);
}