dart 控制台应用

前言

学了挺长时间flutter,最近才发现原来它也可以写控制台应用,而且很方便,这里学习记录一下。

环境

我用的flutter版本是2.5.1,用更高的也可以,用低的话就不支持空安全了。

创建工程

使用命令

dart create console_project

console_project是项目名字,这样就创建好了一个基本的console工程。工程中只有一个dart文件,为了方便我将它命名成main.dart , pubspec.yaml也要一起要改一下名字。main.dart文件中只有一个main函数。

创建命令

这里要用到两个重要的类CommandRunner和Command,Command用来定义一个命令,可以在 CommandRunner中添加多个Command。

class BuildCommand extends Command<void> {
  
  String get description => "build command";

  // 重要,build就是我们要运行的命令
  
  String get name => "build";

  BuildCommand() {
  	// todo 添加命令参数,下面说    
  }

  
  void run() {
    // todo 解析参数
  }
}

上面自定义的BuildCommand中有几个比较重要的方法,name指定这个命令的名称。
先添加上args库用来帮助我们解析命令,自己处理很麻烦

  args: ^2.0.0

下面举一个实际的例子,假设我们希望输入命令 commit --m “first commit” --all 时,能自动把所有文件添加到git仓库中,command就可以实现为

class CommitCommand extends Command<void> {
  @override
  String get description => "";

  @override
  String get name => "commit";

  CommitCommand() {
    argParser.addOption("m");
    argParser.addFlag('all', negatable: false);
  }

  @override
  void run() {
    String msg = argResults!['m'] as String;
    bool all = argResults!['all'] as bool;
    if (all){
    	runCommand('git add .', []);
    	runCommand('git commit -m ', [msg]);
	}
  }
}

在构造函数中添加参数,一般只需要添加两种,一种是Option, 例如argParser.addOption(“m”); 输入时对应的参数是 --m “first commit”,后面需要跟上它对应的参数;另一种是Flag, 例如argParser.addFlag(‘all’, negatable: false); 它输入对应的是–all,后面不需要带参数,表示一个bool型的值。
在run函数中,就可以将定义的option 和flag取出来了。

    String msg = argResults!['m'] as String;
    bool all = argResults!['all'] as bool;

上面的argParser和argResults都是定义在Command类中的。runCommand是我重新写的一个函数来执行终端命令,可以借助process_run这个库来运行终端命令。

定义好一个命令和对应的处理逻辑后,把它们添加到CommandRunner中,就可以运行了。

void main(List<String> arguments) {
  var runner = CommandRunner('dart_tool', "自定义命令行工具");
  runner.addCommand(CommitCommand());
  runner.addCommand(BuildCommand());

  runner.run(arguments).catchError((error) {
    print("error: $error");
  });
}

终端输入

dart bin/main.dart commit --m "first commit" --all 

就可以运行我们的命令了。如果输出错误的命令可以看到提示

➜  console-project git:(main) ✗ dart bin/main.dart buildbuild
error: Could not find a command named "buildbuild".

Usage: dart_tool <command> [arguments]

Global options:
-h, --help    Print this usage information.

Available commands:
  build    build command
  commit   git commit

Run "dart_tool help " for more information about a command.

你可能感兴趣的:(flutter)