Line data Source code
1 : import 'package:args/args.dart'; 2 : import 'package:args/command_runner.dart'; 3 : import 'package:mason/mason.dart'; 4 : import 'package:meta/meta.dart'; 5 : import 'package:path/path.dart' as path; 6 : import 'package:universal_io/io.dart'; 7 : import 'package:very_good_cli/src/cli/cli.dart'; 8 : 9 : /// {@template packages_command} 10 : /// `very_good packages` command for managing packages. 11 : /// {@endtemplate} 12 : class PackagesCommand extends Command<int> { 13 : /// {@macro packages_command} 14 1 : PackagesCommand({Logger? logger}) { 15 2 : addSubcommand(PackagesGetCommand(logger: logger)); 16 : } 17 : 18 1 : @override 19 : String get description => 'Command for managing packages.'; 20 : 21 1 : @override 22 : String get name => 'packages'; 23 : } 24 : 25 : /// {@template packages_get_command} 26 : /// `very_good packages get` command for installing packages. 27 : /// {@endtemplate} 28 : class PackagesGetCommand extends Command<int> { 29 : /// {@macro packages_get_command} 30 1 : PackagesGetCommand({Logger? logger}) : _logger = logger ?? Logger() { 31 1 : argParser 32 1 : ..addFlag( 33 : 'recursive', 34 : abbr: 'r', 35 : help: 'Install dependencies recursively for all nested packages.', 36 : negatable: false, 37 : ) 38 1 : ..addMultiOption( 39 : 'ignore', 40 : help: 'Exclude packages from installing dependencies.', 41 : ); 42 : } 43 : 44 : final Logger _logger; 45 : 46 1 : @override 47 : String get description => 'Get packages in a Dart or Flutter project.'; 48 : 49 1 : @override 50 : String get name => 'get'; 51 : 52 : /// [ArgResults] which can be overridden for testing. 53 : @visibleForTesting 54 : ArgResults? argResultOverrides; 55 : 56 3 : ArgResults get _argResults => argResultOverrides ?? argResults!; 57 : 58 1 : @override 59 : Future<int> run() async { 60 4 : if (_argResults.rest.length > 1) { 61 1 : usageException('Too many arguments'); 62 : } 63 : 64 2 : final recursive = _argResults['recursive'] as bool; 65 3 : final ignore = (_argResults['ignore'] as List<String>).toSet(); 66 7 : final target = _argResults.rest.length == 1 ? _argResults.rest[0] : '.'; 67 4 : final targetPath = path.normalize(Directory(target).absolute.path); 68 2 : final isFlutterInstalled = await Flutter.installed(logger: _logger); 69 : if (isFlutterInstalled) { 70 : try { 71 1 : await Flutter.packagesGet( 72 : cwd: targetPath, 73 : recursive: recursive, 74 : ignore: ignore, 75 1 : logger: _logger, 76 : ); 77 1 : } on PubspecNotFound catch (_) { 78 3 : _logger.err('Could not find a pubspec.yaml in $targetPath'); 79 1 : return ExitCode.noInput.code; 80 : } catch (error) { 81 3 : _logger.err('$error'); 82 1 : return ExitCode.unavailable.code; 83 : } 84 : } 85 1 : return ExitCode.success.code; 86 : } 87 : }