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