编写 dart 命令行程序
dart command-line application
1️⃣ 创建应用
使用 dart create
命令,以 console-full
模板创建一个命令行应用:
1 | $ dart create -t console-full cli |
该命令会创建一个包含下述信息的 Dart 应用:
- 一个主要的 Dart 源文件,
bin/cli.dart
,该文件包含一个顶层main()
函数。该函数是你应用的入口。 - 一个额外的 Dart 文件,
lib/cli.dart
,包含一些功能性的函数方法,这些函数方法将会导入到cli.dart
文件中。 - 一个 pubspec 文件,
pubspec.yaml
,包含应用的元数据,包括应用依赖的 package 信息以及所需的版本等。
2️⃣ 运行应用
使用 dart run
命令在应用的根目录运行 Dart VM:
1 | $ cd cli |
3️⃣ 输入输出
stdin
, stdout
, and stderr
.
导入 dart:io
。
1 | import 'dart:io'; |
stdout
The standard output1
2
3
4
5
6stdout.write('Hello '); // 不换行
stdout.writeln('World'); // 换行
/// 输出
$ dart run bin/cli.dart
Hello World!stdin
The standard input1
2
3
4
5
6
7
8stdout.writeln('Type something:');
final input = stdin.readLineSync(); // 等待用户输入
stdout.writeln('Yout typed: $input');
/// 输出
Type something:
Hola
Yout typed: Holastderr
The standard input1
2
3
4
5
6
7
8if (input != 'Hola') {
stderr.writeln('error: input $input != \'Hola\'');
}
Type something:
Hello
Yout typed: Hello
error: input Hello != 'Hola' // stderr
4️⃣ 写入文件
新建文件,写入数据。
1
2
3
4
5final file = File('text.txt');
final str = 'The quick brown fox jumps over the lazy dog.';
await file.writeAsString(str, mode: FileMode.write);
// 当前文件夹生成 text.txt 文件。打开文件,写入更多数据。
1
2
3
4
5final file = File('text.txt').openWrite(mode: FileMode.append);
file.write('The quick brown fox ');
file.writeln('jumps over the lazy dog.');
await file.close();
5️⃣ 文件夹操作
导入 path
库:import 'package:path/path.dart';
1 | final dir = Directory('lib'); |
6️⃣ 使用 platform 获取环境变量
1 | final envVarMap = Platform.environment; |
7️⃣ 设置 exit codes
1 | ... |
8️⃣ 解析命令行参数
添加 args 依赖
1
2
3
4// pubspec.yaml
dependencies:
args:导入
1
import 'package:args/args.dart';
使用
ArgParser
解析1
2
3
4
5
6
7
8final parser = ArgParser()..addOption('name', abbr: 'n', help: 'Greeting');
final argResults = parser.parse(arguments);
final name = argResults['name'];
print('Hello $name!');
// 输出
$ pub run cli -n World
Hello World!
9️⃣ 多命令 CommandRunner
导入
1
import 'package:args/command_runner.dart';
自定义命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17class GreetingCommand extends Command {
GreetingCommand() {
argParser.addOption('name', abbr: 'n', help: 'Greeting');
}
String get name => 'greeting';
String get description => '欢迎';
void run() {
final name = argResults['name'];
print('Hello $name!');
}
}使用
CommandRunner
添加命令1
2
3
4
5
6
7void main(List<String> arguments) {
CommandRunner('cli', 'desc')
..addCommand(GreetingCommand())
..run(arguments);
exitCode = 0;
}命令行使用说明 (help)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23// cli 帮助
$ pub run cli -h
desc
Usage: cli <command> [arguments]
Global options:
-h, --help Print this usage information.
Available commands:
greeting 欢迎
Run "cli help <command>" for more information about a command.
// greeting 帮助
$ pub run cli greeting -h
欢迎
Usage: cli greeting [arguments]
-h, --help Print this usage information.
-n, --name Greeting
Run "cli help" to see global options.
🔟 catch error
1 | void main(List<String> arguments) async { |
1 | $ pub run cli greeting -n |