packages.dart 5.8 KB
Newer Older
1 2 3 4 5 6
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';

7
import '../base/common.dart';
8 9
import '../base/os.dart';
import '../dart/pub.dart';
10
import '../project.dart';
11 12 13 14
import '../runner/flutter_command.dart';

class PackagesCommand extends FlutterCommand {
  PackagesCommand() {
15 16 17
    addSubcommand(PackagesGetCommand('get', false));
    addSubcommand(PackagesGetCommand('upgrade', true));
    addSubcommand(PackagesTestCommand());
18
    addSubcommand(PackagesForwardCommand('downgrade', 'Downgrade packages in a Flutter project', requiresPubspec: true));
19
    addSubcommand(PackagesForwardCommand('publish', 'Publish the current package to pub.dev', requiresPubspec: true));
20 21 22 23
    addSubcommand(PackagesForwardCommand('deps', 'Print package dependencies', requiresPubspec: true));
    addSubcommand(PackagesForwardCommand('run', 'Run an executable from a package', requiresPubspec: true));
    addSubcommand(PackagesForwardCommand('cache', 'Work with the Pub system cache'));
    addSubcommand(PackagesForwardCommand('version', 'Print Pub version'));
24
    addSubcommand(PackagesForwardCommand('uploader', 'Manage uploaders for a package on pub.dev'));
25
    addSubcommand(PackagesForwardCommand('global', 'Work with Pub global packages'));
26
    addSubcommand(PackagesPassthroughCommand());
27 28 29 30 31 32 33 34 35 36 37
  }

  @override
  final String name = 'packages';

  @override
  List<String> get aliases => const <String>['pub'];

  @override
  final String description = 'Commands for managing Flutter packages.';

38 39 40 41 42
  @override
  Future<Set<DevelopmentArtifact>> get requiredArtifacts async => const <DevelopmentArtifact>{
    DevelopmentArtifact.universal,
  };

43
  @override
44
  Future<FlutterCommandResult> runCommand() async => null;
45 46 47
}

class PackagesGetCommand extends FlutterCommand {
48
  PackagesGetCommand(this.name, this.upgrade) {
49
    requiresPubspecYaml();
50 51
    argParser.addFlag('offline',
      negatable: false,
52
      help: 'Use cached packages instead of accessing the network.',
53 54
    );
  }
55

56 57 58 59 60
  @override
  final String name;

  final bool upgrade;

61
  @override
62 63 64
  String get description {
    return '${ upgrade ? "Upgrade" : "Get" } packages in a Flutter project.';
  }
65 66

  @override
67 68 69
  String get invocation {
    return '${runner.executableName} packages $name [<target directory>]';
  }
70

71 72 73 74 75 76 77 78 79
  Future<void> _runPubGet (String directory) async {
    await pubGet(context: PubContext.pubGet,
      directory: directory,
      upgrade: upgrade ,
      offline: argResults['offline'],
      checkLastModified: false,
    );
  }

80
  @override
81
  Future<FlutterCommandResult> runCommand() async {
82 83
    if (argResults.rest.length > 1)
      throwToolExit('Too many arguments.\n$usage');
84

85
    final String target = findProjectRoot(
86 87 88
      argResults.rest.length == 1 ? argResults.rest[0] : null
    );
    if (target == null) {
89
      throwToolExit(
90 91 92 93
       'Expected to find project root in '
       '${ argResults.rest.length == 1 ? argResults.rest[0] : "current working directory" }.'
      );
    }
94

95
    await _runPubGet(target);
96
    final FlutterProject rootProject = FlutterProject.fromPath(target);
97
    await rootProject.ensureReadyForPlatformSpecificTooling(checkProjects: true);
98 99 100 101 102

    // Get/upgrade packages in example app as well
    if (rootProject.hasExampleApp) {
      final FlutterProject exampleProject = rootProject.example;
      await _runPubGet(exampleProject.directory.path);
103
      await exampleProject.ensureReadyForPlatformSpecificTooling(checkProjects: true);
104
    }
105 106

    return null;
107 108
  }
}
109 110

class PackagesTestCommand extends FlutterCommand {
111 112 113 114
  PackagesTestCommand() {
    requiresPubspecYaml();
  }

115 116 117 118 119 120
  @override
  String get name => 'test';

  @override
  String get description {
    return 'Run the "test" package.\n'
121 122 123 124
           'This is similar to "flutter test", but instead of hosting the tests in the '
           'flutter environment it hosts the tests in a pure Dart environment. The main '
           'differences are that the "dart:ui" library is not available and that tests '
           'run faster. This is helpful for testing libraries that do not depend on any '
125 126 127 128 129 130 131 132 133
           'packages from the Flutter SDK. It is equivalent to "pub run test".';
  }

  @override
  String get invocation {
    return '${runner.executableName} packages test [<tests...>]';
  }

  @override
134 135 136 137
  Future<FlutterCommandResult> runCommand() async {
    await pub(<String>['run', 'test']..addAll(argResults.rest), context: PubContext.runTest, retry: false);
    return null;
  }
138 139
}

140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
class PackagesForwardCommand extends FlutterCommand {
  PackagesForwardCommand(this._commandName, this._description, {bool requiresPubspec = false}) {
    if (requiresPubspec) {
      requiresPubspecYaml();
    }
  }
  final String _commandName;
  final String _description;

  @override
  String get name => _commandName;

  @override
  String get description {
    return '$_description.\n'
           'This runs the "pub" tool in a Flutter context.';
  }

  @override
  String get invocation {
    return '${runner.executableName} packages $_commandName [<arguments...>]';
  }

  @override
  Future<FlutterCommandResult> runCommand() async {
    await pub(<String>[_commandName]..addAll(argResults.rest), context: PubContext.pubForward, retry: false);
    return null;
  }

}

171
class PackagesPassthroughCommand extends FlutterCommand {
172 173 174
  PackagesPassthroughCommand() {
    requiresPubspecYaml();
  }
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190

  @override
  String get name => 'pub';

  @override
  String get description {
    return 'Pass the remaining arguments to Dart\'s "pub" tool.\n'
           'This runs the "pub" tool in a Flutter context.';
  }

  @override
  String get invocation {
    return '${runner.executableName} packages pub [<arguments...>]';
  }

  @override
191 192 193 194
  Future<FlutterCommandResult> runCommand() async {
    await pubInteractively(argResults.rest);
    return null;
  }
195
}