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