Dart CLI 开发上手

3,988 阅读2分钟

DartPad 运行

你可以使用 DartPad 来简单地尝试 Dart 编程语言和 API 且不需要下载任何东西。

安装 Dart

使用 Homebrew,安装 Dart 很容易。

brew tap dart-lang/dart
brew install dart

创建一个小应用

使用 dart create 命令,以 console-full 模板创建一个命令行应用:

dart create -t console-full cli

该命令会创建一个包含下述信息的 Dart 应用:

  • 一个主要的 Dart 源文件,bin/cli.dart,该文件包含一个顶层 main() 函数。该函数是你应用的入口。
  • 一个额外的 Dart 文件,lib/cli.dart,包含一些功能性的函数方法,这些函数方法将会导入到 cli.dart 文件中。
  • 一个 pubspec 文件,pubspec.yaml,包含应用的元数据,包括应用依赖的 package 信息以及所需的版本等。

运行应用

想要从命令行运行应用,请使用 dart run 命令在应用的根目录运行 Dart VM:

cd cli
dart run

Untitled.png

编译成正式产品

上面的示例步骤我们使用的是 Dart VM(即 dart 命令)运行的应用。 Dart VM 针对快速增量编译进行了优化,以便在开发过程中提供即时的响应。现在你的小应用已经完成,是时候 AOT 优化编译你的 Dart 代码为原生机器代码了。

使用 dart compile 工具将程序 AOT 编译成机器代码:

dart compile exe bin/cli.dart

看看编译后的程序启动有多快:

time bin/cli.exe

Untitled.png

获取依赖

如需要获取依赖包,如 args 包,请使用 Pub 包管理器

不过,对于第一个 CLI,我们可以轻松使用 dart pub add 命令添加所需的内容。

dart pub add args

Untitled.png

Untitled.png

dcat 应用代码示例

标准输入并打印实现参考示例,需要使用上面的 args 依赖库。

import 'dart:convert';
import 'dart:io';

import 'package:args/args.dart';

const lineNumber = 'line-number';

void main(List<String> arguments) {
  exitCode = 0; // presume success
  final parser = ArgParser()..addFlag(lineNumber, negatable: false, abbr: 'n');

  ArgResults argResults = parser.parse(arguments);
  final paths = argResults.rest;

  dcat(paths, showLineNumbers: argResults[lineNumber] as bool);
}

Future<void> dcat(List<String> paths, {bool showLineNumbers = false}) async {
  if (paths.isEmpty) {
    // No files provided as arguments. Read from stdin and print each line.
    await stdin.pipe(stdout);
  } else {
    for (final path in paths) {
      var lineNumber = 1;
      final lines = utf8.decoder
          .bind(File(path).openRead())
          .transform(const LineSplitter());
      try {
        await for (final line in lines) {
          if (showLineNumbers) {
            stdout.write('${lineNumber++} ');
          }
          stdout.writeln(line);
        }
      } catch (_) {
        await _handleError(path);
      }
    }
  }
}

Future<void> _handleError(String path) async {
  if (await FileSystemEntity.isDirectory(path)) {
    stderr.writeln('error: $path is a directory');
  } else {
    exitCode = 2;
  }
}

Untitled.png

发布

和 Flutter 库包发布流程类似,可以选择提交到官方 Dart Pub,或者自己的私服。