packages.dart 4.08 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 18
    addSubcommand(PackagesGetCommand('get', false));
    addSubcommand(PackagesGetCommand('upgrade', true));
    addSubcommand(PackagesTestCommand());
    addSubcommand(PackagesPassthroughCommand());
19 20 21 22 23 24 25 26 27 28 29
  }

  @override
  final String name = 'packages';

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

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

30
  @override
31
  Future<FlutterCommandResult> runCommand() async => null;
32 33 34
}

class PackagesGetCommand extends FlutterCommand {
35
  PackagesGetCommand(this.name, this.upgrade) {
36
    requiresPubspecYaml();
37 38 39 40 41
    argParser.addFlag('offline',
      negatable: false,
      help: 'Use cached packages instead of accessing the network.'
    );
  }
42

43 44 45 46 47
  @override
  final String name;

  final bool upgrade;

48
  @override
49 50 51
  String get description {
    return '${ upgrade ? "Upgrade" : "Get" } packages in a Flutter project.';
  }
52 53

  @override
54 55 56
  String get invocation {
    return '${runner.executableName} packages $name [<target directory>]';
  }
57

58 59 60 61 62 63 64 65 66
  Future<void> _runPubGet (String directory) async {
    await pubGet(context: PubContext.pubGet,
      directory: directory,
      upgrade: upgrade ,
      offline: argResults['offline'],
      checkLastModified: false,
    );
  }

67
  @override
68
  Future<FlutterCommandResult> runCommand() async {
69 70
    if (argResults.rest.length > 1)
      throwToolExit('Too many arguments.\n$usage');
71

72
    final String target = findProjectRoot(
73 74 75
      argResults.rest.length == 1 ? argResults.rest[0] : null
    );
    if (target == null) {
76
      throwToolExit(
77 78 79 80
       'Expected to find project root in '
       '${ argResults.rest.length == 1 ? argResults.rest[0] : "current working directory" }.'
      );
    }
81

82
    await _runPubGet(target);
83
    final FlutterProject rootProject = await FlutterProject.fromPath(target);
84
    await rootProject.ensureReadyForPlatformSpecificTooling();
85 86 87 88 89

    // Get/upgrade packages in example app as well
    if (rootProject.hasExampleApp) {
      final FlutterProject exampleProject = rootProject.example;
      await _runPubGet(exampleProject.directory.path);
90
      await exampleProject.ensureReadyForPlatformSpecificTooling();
91
    }
92 93

    return null;
94 95
  }
}
96 97

class PackagesTestCommand extends FlutterCommand {
98 99 100 101
  PackagesTestCommand() {
    requiresPubspecYaml();
  }

102 103 104 105 106 107
  @override
  String get name => 'test';

  @override
  String get description {
    return 'Run the "test" package.\n'
108 109 110 111
           '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 '
112 113 114 115 116 117 118 119 120
           'packages from the Flutter SDK. It is equivalent to "pub run test".';
  }

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

  @override
121 122 123 124
  Future<FlutterCommandResult> runCommand() async {
    await pub(<String>['run', 'test']..addAll(argResults.rest), context: PubContext.runTest, retry: false);
    return null;
  }
125 126 127
}

class PackagesPassthroughCommand extends FlutterCommand {
128 129 130
  PackagesPassthroughCommand() {
    requiresPubspecYaml();
  }
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

  @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
147 148 149 150
  Future<FlutterCommandResult> runCommand() async {
    await pubInteractively(argResults.rest);
    return null;
  }
151
}