Skip to content

Commit

Permalink
Build command dependency injection (#114383)
Browse files Browse the repository at this point in the history
* update flutter build command

* update tests

* fix analyze suggestions
  • Loading branch information
Jasguerrero committed Nov 8, 2022
1 parent 9797d5f commit 530324d
Show file tree
Hide file tree
Showing 29 changed files with 999 additions and 213 deletions.
9 changes: 8 additions & 1 deletion packages/flutter_tools/lib/executable.dart
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,14 @@ List<FlutterCommand> generateCommands({
processInfo: globals.processInfo,
fileSystem: globals.fs,
),
BuildCommand(verboseHelp: verboseHelp),
BuildCommand(
fileSystem: globals.fs,
buildSystem: globals.buildSystem,
osUtils: globals.os,
verboseHelp: verboseHelp,
androidSdk: globals.androidSdk,
logger: globals.logger,
),
ChannelCommand(verboseHelp: verboseHelp),
CleanCommand(verbose: verbose),
ConfigCommand(verboseHelp: verboseHelp),
Expand Down
70 changes: 50 additions & 20 deletions packages/flutter_tools/lib/src/commands/build.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,15 @@

import 'package:meta/meta.dart';

import '../android/android_sdk.dart';
import '../base/file_system.dart';
import '../base/logger.dart';
import '../base/os.dart';
import '../build_info.dart';
import '../build_system/build_system.dart';
import '../commands/build_linux.dart';
import '../commands/build_macos.dart';
import '../commands/build_windows.dart';
import '../globals.dart' as globals;
import '../runner/flutter_command.dart';
import 'build_aar.dart';
import 'build_apk.dart';
Expand All @@ -20,28 +24,49 @@ import 'build_macos_framework.dart';
import 'build_web.dart';

class BuildCommand extends FlutterCommand {
BuildCommand({ bool verboseHelp = false }) {
_addSubcommand(BuildAarCommand(verboseHelp: verboseHelp));
_addSubcommand(BuildApkCommand(verboseHelp: verboseHelp));
_addSubcommand(BuildAppBundleCommand(verboseHelp: verboseHelp));
_addSubcommand(BuildIOSCommand(verboseHelp: verboseHelp));
BuildCommand({
required FileSystem fileSystem,
required BuildSystem buildSystem,
required OperatingSystemUtils osUtils,
required Logger logger,
required AndroidSdk? androidSdk,
bool verboseHelp = false,
}){
_addSubcommand(
BuildAarCommand(
fileSystem: fileSystem,
androidSdk: androidSdk,
logger: logger,
verboseHelp: verboseHelp,
)
);
_addSubcommand(BuildApkCommand(logger: logger, verboseHelp: verboseHelp));
_addSubcommand(BuildAppBundleCommand(logger: logger, verboseHelp: verboseHelp));
_addSubcommand(BuildIOSCommand(logger: logger, verboseHelp: verboseHelp));
_addSubcommand(BuildIOSFrameworkCommand(
buildSystem: globals.buildSystem,
logger: logger,
buildSystem: buildSystem,
verboseHelp: verboseHelp,
));
_addSubcommand(BuildMacOSFrameworkCommand(
buildSystem: globals.buildSystem,
logger: logger,
buildSystem: buildSystem,
verboseHelp: verboseHelp,
));
_addSubcommand(BuildIOSArchiveCommand(verboseHelp: verboseHelp));
_addSubcommand(BuildBundleCommand(verboseHelp: verboseHelp));
_addSubcommand(BuildWebCommand(verboseHelp: verboseHelp));
_addSubcommand(BuildMacosCommand(verboseHelp: verboseHelp));
_addSubcommand(BuildIOSArchiveCommand(logger: logger, verboseHelp: verboseHelp));
_addSubcommand(BuildBundleCommand(logger: logger, verboseHelp: verboseHelp));
_addSubcommand(BuildWebCommand(
fileSystem: fileSystem,
logger: logger,
verboseHelp: verboseHelp,
));
_addSubcommand(BuildMacosCommand(logger: logger, verboseHelp: verboseHelp));
_addSubcommand(BuildLinuxCommand(
operatingSystemUtils: globals.os,
logger: logger,
operatingSystemUtils: osUtils,
verboseHelp: verboseHelp
));
_addSubcommand(BuildWindowsCommand(verboseHelp: verboseHelp));
_addSubcommand(BuildWindowsCommand(logger: logger, verboseHelp: verboseHelp));
}

void _addSubcommand(BuildSubCommand command) {
Expand All @@ -64,11 +89,16 @@ class BuildCommand extends FlutterCommand {
}

abstract class BuildSubCommand extends FlutterCommand {
BuildSubCommand({required bool verboseHelp}) {
BuildSubCommand({
required Logger logger,
required bool verboseHelp
}): _logger = logger {
requiresPubspecYaml();
usesFatalWarningsOption(verboseHelp: verboseHelp);
}

final Logger _logger;

@override
bool get reportNullSafety => true;

Expand All @@ -80,21 +110,21 @@ abstract class BuildSubCommand extends FlutterCommand {
/// This is similar to the run message in run_hot.dart
@protected
void displayNullSafetyMode(BuildInfo buildInfo) {
globals.printStatus('');
_logger.printStatus('');
if (buildInfo.nullSafetyMode == NullSafetyMode.sound) {
globals.printStatus(
_logger.printStatus(
'💪 Building with sound null safety 💪',
emphasis: true,
);
} else {
globals.printStatus(
_logger.printStatus(
'Building without sound null safety ⚠️',
emphasis: true,
);
globals.printStatus(
_logger.printStatus(
'Dart 3 will only support sound null safety, see https://dart.dev/null-safety',
);
}
globals.printStatus('');
_logger.printStatus('');
}
}
25 changes: 17 additions & 8 deletions packages/flutter_tools/lib/src/commands/build_aar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,28 @@
// found in the LICENSE file.

import '../android/android_builder.dart';
import '../android/android_sdk.dart';
import '../android/gradle_utils.dart';
import '../base/common.dart';

import '../base/file_system.dart';
import '../base/os.dart';
import '../build_info.dart';
import '../cache.dart';
import '../globals.dart' as globals;
import '../project.dart';
import '../reporting/reporting.dart';
import '../runner/flutter_command.dart' show FlutterCommandResult;
import 'build.dart';

class BuildAarCommand extends BuildSubCommand {
BuildAarCommand({ required bool verboseHelp }) : super(verboseHelp: verboseHelp) {
BuildAarCommand({
required super.logger,
required AndroidSdk? androidSdk,
required FileSystem fileSystem,
required bool verboseHelp,
}): _androidSdk = androidSdk,
_fileSystem = fileSystem,
super(verboseHelp: verboseHelp) {
argParser
..addFlag(
'debug',
Expand Down Expand Up @@ -55,6 +62,8 @@ class BuildAarCommand extends BuildSubCommand {
help: 'The target platform for which the project is compiled.',
);
}
final AndroidSdk? _androidSdk;
final FileSystem _fileSystem;

@override
final String name = 'aar';
Expand Down Expand Up @@ -100,7 +109,7 @@ class BuildAarCommand extends BuildSubCommand {

@override
Future<FlutterCommandResult> runCommand() async {
if (globals.androidSdk == null) {
if (_androidSdk == null) {
exitWithNoSdkMessage();
}
final Set<AndroidBuildInfo> androidBuildInfo = <AndroidBuildInfo>{};
Expand All @@ -115,7 +124,7 @@ class BuildAarCommand extends BuildSubCommand {
? buildNumberArg
: '1.0';

final File targetFile = globals.fs.file(globals.fs.path.join('lib', 'main.dart'));
final File targetFile = _fileSystem.file(_fileSystem.path.join('lib', 'main.dart'));
for (final String buildMode in const <String>['debug', 'profile', 'release']) {
if (boolArgDeprecated(buildMode)) {
androidBuildInfo.add(
Expand Down Expand Up @@ -151,21 +160,21 @@ class BuildAarCommand extends BuildSubCommand {
if (remainingArguments.isEmpty) {
return FlutterProject.current();
}
final File mainFile = globals.fs.file(remainingArguments.first);
final File mainFile = _fileSystem.file(remainingArguments.first);
final String path;
if (!mainFile.existsSync()) {
final Directory pathProject = globals.fs.directory(remainingArguments.first);
final Directory pathProject = _fileSystem.directory(remainingArguments.first);
if (!pathProject.existsSync()) {
throwToolExit('${remainingArguments.first} does not exist');
}
path = pathProject.path;
} else {
path = mainFile.parent.path;
}
final String? projectRoot = findProjectRoot(globals.fs, path);
final String? projectRoot = findProjectRoot(_fileSystem, path);
if (projectRoot == null) {
throwToolExit('${mainFile.parent.path} is not a valid flutter project');
}
return FlutterProject.fromDirectory(globals.fs.directory(projectRoot));
return FlutterProject.fromDirectory(_fileSystem.directory(projectRoot));
}
}
4 changes: 3 additions & 1 deletion packages/flutter_tools/lib/src/commands/build_apk.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ import '../runner/flutter_command.dart' show FlutterCommandResult;
import 'build.dart';

class BuildApkCommand extends BuildSubCommand {
BuildApkCommand({bool verboseHelp = false}) : super(verboseHelp: verboseHelp) {
BuildApkCommand({
required super.logger, bool verboseHelp = false
}) : super(verboseHelp: verboseHelp) {
addTreeShakeIconsFlag();
usesTargetOption();
addBuildModeFlags(verboseHelp: verboseHelp);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import 'build.dart';

class BuildAppBundleCommand extends BuildSubCommand {
BuildAppBundleCommand({
required super.logger,
bool verboseHelp = false,
}) : super(verboseHelp: verboseHelp) {
addTreeShakeIconsFlag();
Expand Down
1 change: 1 addition & 0 deletions packages/flutter_tools/lib/src/commands/build_bundle.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import 'build.dart';

class BuildBundleCommand extends BuildSubCommand {
BuildBundleCommand({
required super.logger,
bool verboseHelp = false,
BundleBuilder? bundleBuilder,
}) : _bundleBuilder = bundleBuilder ?? BundleBuilder(), super(verboseHelp: verboseHelp) {
Expand Down
5 changes: 3 additions & 2 deletions packages/flutter_tools/lib/src/commands/build_ios.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import 'build.dart';
/// Builds an .app for an iOS app to be used for local testing on an iOS device
/// or simulator. Can only be run on a macOS host.
class BuildIOSCommand extends _BuildIOSSubCommand {
BuildIOSCommand({ required super.verboseHelp }) {
BuildIOSCommand({ required super.logger, required super.verboseHelp }) {
argParser
..addFlag('config-only',
help: 'Update the project configuration without performing a build. '
Expand Down Expand Up @@ -59,7 +59,7 @@ class BuildIOSCommand extends _BuildIOSSubCommand {
///
/// Can only be run on a macOS host.
class BuildIOSArchiveCommand extends _BuildIOSSubCommand {
BuildIOSArchiveCommand({required super.verboseHelp}) {
BuildIOSArchiveCommand({required super.logger, required super.verboseHelp}) {
argParser.addOption(
'export-method',
defaultsTo: 'app-store',
Expand Down Expand Up @@ -293,6 +293,7 @@ class BuildIOSArchiveCommand extends _BuildIOSSubCommand {

abstract class _BuildIOSSubCommand extends BuildSubCommand {
_BuildIOSSubCommand({
required super.logger,
required bool verboseHelp
}) : super(verboseHelp: verboseHelp) {
addTreeShakeIconsFlag();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ abstract class BuildFrameworkCommand extends BuildSubCommand {
required bool verboseHelp,
Cache? cache,
Platform? platform,
required super.logger,
}) : _injectedFlutterVersion = flutterVersion,
_buildSystem = buildSystem,
_injectedCache = cache,
Expand Down Expand Up @@ -176,6 +177,7 @@ abstract class BuildFrameworkCommand extends BuildSubCommand {
/// managers.
class BuildIOSFrameworkCommand extends BuildFrameworkCommand {
BuildIOSFrameworkCommand({
required super.logger,
super.flutterVersion,
required super.buildSystem,
required bool verboseHelp,
Expand Down
1 change: 1 addition & 0 deletions packages/flutter_tools/lib/src/commands/build_linux.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import 'build.dart';
/// A command to build a linux desktop target through a build shell script.
class BuildLinuxCommand extends BuildSubCommand {
BuildLinuxCommand({
required super.logger,
required OperatingSystemUtils operatingSystemUtils,
bool verboseHelp = false,
}) : _operatingSystemUtils = operatingSystemUtils,
Expand Down
1 change: 1 addition & 0 deletions packages/flutter_tools/lib/src/commands/build_macos.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import 'build.dart';
/// A command to build a macOS desktop target through a build shell script.
class BuildMacosCommand extends BuildSubCommand {
BuildMacosCommand({
required super.logger,
required bool verboseHelp,
}) : super(verboseHelp: verboseHelp) {
addCommonDesktopBuildOptions(verboseHelp: verboseHelp);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class BuildMacOSFrameworkCommand extends BuildFrameworkCommand {
super.flutterVersion,
required super.buildSystem,
required super.verboseHelp,
required super.logger,
super.cache,
super.platform,
});
Expand Down
10 changes: 7 additions & 3 deletions packages/flutter_tools/lib/src/commands/build_web.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
// found in the LICENSE file.

import '../base/common.dart';
import '../base/file_system.dart';
import '../build_info.dart';
import '../build_system/targets/web.dart';
import '../features.dart';
import '../globals.dart' as globals;
import '../project.dart';
import '../runner/flutter_command.dart'
show DevelopmentArtifact, FlutterCommandResult;
Expand All @@ -15,8 +15,10 @@ import 'build.dart';

class BuildWebCommand extends BuildSubCommand {
BuildWebCommand({
required super.logger,
required FileSystem fileSystem,
required bool verboseHelp,
}) : super(verboseHelp: verboseHelp) {
}) : _fileSystem = fileSystem, super(verboseHelp: verboseHelp) {
addTreeShakeIconsFlag(enabledByDefault: false);
usesTargetOption();
usesOutputDir();
Expand Down Expand Up @@ -70,6 +72,8 @@ class BuildWebCommand extends BuildSubCommand {
);
}

final FileSystem _fileSystem;

@override
Future<Set<DevelopmentArtifact>> get requiredArtifacts async =>
const <DevelopmentArtifact>{
Expand Down Expand Up @@ -103,7 +107,7 @@ class BuildWebCommand extends BuildSubCommand {
if (!flutterProject.web.existsSync()) {
throwToolExit('Missing index.html.');
}
if (!globals.fs.currentDirectory
if (!_fileSystem.currentDirectory
.childDirectory('web')
.childFile('index.html')
.readAsStringSync()
Expand Down
1 change: 1 addition & 0 deletions packages/flutter_tools/lib/src/commands/build_windows.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import 'build.dart';
/// A command to build a windows desktop target through a build shell script.
class BuildWindowsCommand extends BuildSubCommand {
BuildWindowsCommand({
required super.logger,
bool verboseHelp = false,
}) : super(verboseHelp: verboseHelp) {
addCommonDesktopBuildOptions(verboseHelp: verboseHelp);
Expand Down
Loading

0 comments on commit 530324d

Please sign in to comment.