Command-Line Applications

Packages: args (parsing), cli_util, mason_logger (styled output, prompts, progress), io, ansi_styles, interact, dcli (shell-scripting library), path, yaml.

// bin/todo.dart
import 'dart:io';
import 'package:args/args.dart';
import 'package:args/command_runner.dart';

class AddCommand extends Command<void> {
  @override
  final name = 'add';
  @override
  final description = 'Add a task.';
  AddCommand() {
    argParser.addOption('priority', abbr: 'p', allowed: ['low', 'normal', 'high'], defaultsTo: 'normal');
  }
  @override
  void run() {
    final task = argResults!.rest.join(' ');
    if (task.isEmpty) usageException('Task text is required.');
    print('Added "$task" (${argResults!['priority']})');
  }
}

class ListCommand extends Command<void> {
  @override
  final name = 'list';
  @override
  final description = 'List tasks.';
  @override
  void run() => print('No tasks yet.');
}

Future<void> main(List<String> args) async {
  final runner = CommandRunner<void>('todo', 'A simple todo manager.')
    ..addCommand(AddCommand())
    ..addCommand(ListCommand())
    ..argParser.addFlag('verbose', abbr: 'v', negatable: false);
  try {
    await runner.run(args);
  } on UsageException catch (e) {
    stderr.writeln(e);
    exit(64);
  }
}
dart run bin/todo.dart add -p high "Write course"
dart compile exe bin/todo.dart -o todo && ./todo list
dart pub global activate --source path .     # install globally