blob: 7d61ed21dcf2362f0cd36d6822f1c7e70ef7e980 [file] [log] [blame]
// 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';
import '../base/common.dart';
import '../base/file_system.dart';
import '../base/os.dart';
import '../dart/pub.dart';
import '../project.dart';
import '../runner/flutter_command.dart';
class PackagesCommand extends FlutterCommand {
PackagesCommand() {
addSubcommand(new PackagesGetCommand('get', false));
addSubcommand(new PackagesGetCommand('upgrade', true));
addSubcommand(new PackagesTestCommand());
addSubcommand(new PackagesPassthroughCommand());
}
@override
final String name = 'packages';
@override
List<String> get aliases => const <String>['pub'];
@override
final String description = 'Commands for managing Flutter packages.';
@override
Future<Null> runCommand() async { }
}
class PackagesGetCommand extends FlutterCommand {
PackagesGetCommand(this.name, this.upgrade) {
requiresPubspecYaml();
argParser.addFlag('offline',
negatable: false,
help: 'Use cached packages instead of accessing the network.'
);
}
@override
final String name;
final bool upgrade;
@override
String get description {
return '${ upgrade ? "Upgrade" : "Get" } packages in a Flutter project.';
}
@override
String get invocation {
return '${runner.executableName} packages $name [<target directory>]';
}
Future<void> _runPubGet (String directory) async {
await pubGet(context: PubContext.pubGet,
directory: directory,
upgrade: upgrade ,
offline: argResults['offline'],
checkLastModified: false,
);
}
@override
Future<Null> runCommand() async {
if (argResults.rest.length > 1)
throwToolExit('Too many arguments.\n$usage');
final String target = findProjectRoot(
argResults.rest.length == 1 ? argResults.rest[0] : null
);
if (target == null) {
throwToolExit(
'Expected to find project root in '
'${ argResults.rest.length == 1 ? argResults.rest[0] : "current working directory" }.'
);
}
await _runPubGet(target);
final FlutterProject rootProject = new FlutterProject(fs.directory(target));
rootProject.ensureReadyForPlatformSpecificTooling();
// Get/upgrade packages in example app as well
if (rootProject.hasExampleApp) {
final FlutterProject exampleProject = rootProject.example;
await _runPubGet(exampleProject.directory.path);
exampleProject.ensureReadyForPlatformSpecificTooling();
}
}
}
class PackagesTestCommand extends FlutterCommand {
PackagesTestCommand() {
requiresPubspecYaml();
}
@override
String get name => 'test';
@override
String get description {
return 'Run the "test" package.\n'
'This is similar to "flutter test", but instead of hosting the tests in the\n'
'flutter environment it hosts the tests in a pure Dart environment. The main\n'
'differences are that the "dart:ui" library is not available and that tests\n'
'run faster. This is helpful for testing libraries that do not depend on any\n'
'packages from the Flutter SDK. It is equivalent to "pub run test".';
}
@override
String get invocation {
return '${runner.executableName} packages test [<tests...>]';
}
@override
Future<Null> runCommand() => pub(<String>['run', 'test']..addAll(argResults.rest), context: PubContext.runTest, retry: false);
}
class PackagesPassthroughCommand extends FlutterCommand {
PackagesPassthroughCommand() {
requiresPubspecYaml();
}
@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
Future<Null> runCommand() => pubInteractively(argResults.rest);
}