Skip to content

Commit 530324d

Browse files
authored
Build command dependency injection (#114383)
* update flutter build command * update tests * fix analyze suggestions
1 parent 9797d5f commit 530324d

29 files changed

+999
-213
lines changed

packages/flutter_tools/lib/executable.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,14 @@ List<FlutterCommand> generateCommands({
165165
processInfo: globals.processInfo,
166166
fileSystem: globals.fs,
167167
),
168-
BuildCommand(verboseHelp: verboseHelp),
168+
BuildCommand(
169+
fileSystem: globals.fs,
170+
buildSystem: globals.buildSystem,
171+
osUtils: globals.os,
172+
verboseHelp: verboseHelp,
173+
androidSdk: globals.androidSdk,
174+
logger: globals.logger,
175+
),
169176
ChannelCommand(verboseHelp: verboseHelp),
170177
CleanCommand(verbose: verbose),
171178
ConfigCommand(verboseHelp: verboseHelp),

packages/flutter_tools/lib/src/commands/build.dart

Lines changed: 50 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@
44

55
import 'package:meta/meta.dart';
66

7+
import '../android/android_sdk.dart';
8+
import '../base/file_system.dart';
9+
import '../base/logger.dart';
10+
import '../base/os.dart';
711
import '../build_info.dart';
12+
import '../build_system/build_system.dart';
813
import '../commands/build_linux.dart';
914
import '../commands/build_macos.dart';
1015
import '../commands/build_windows.dart';
11-
import '../globals.dart' as globals;
1216
import '../runner/flutter_command.dart';
1317
import 'build_aar.dart';
1418
import 'build_apk.dart';
@@ -20,28 +24,49 @@ import 'build_macos_framework.dart';
2024
import 'build_web.dart';
2125

2226
class BuildCommand extends FlutterCommand {
23-
BuildCommand({ bool verboseHelp = false }) {
24-
_addSubcommand(BuildAarCommand(verboseHelp: verboseHelp));
25-
_addSubcommand(BuildApkCommand(verboseHelp: verboseHelp));
26-
_addSubcommand(BuildAppBundleCommand(verboseHelp: verboseHelp));
27-
_addSubcommand(BuildIOSCommand(verboseHelp: verboseHelp));
27+
BuildCommand({
28+
required FileSystem fileSystem,
29+
required BuildSystem buildSystem,
30+
required OperatingSystemUtils osUtils,
31+
required Logger logger,
32+
required AndroidSdk? androidSdk,
33+
bool verboseHelp = false,
34+
}){
35+
_addSubcommand(
36+
BuildAarCommand(
37+
fileSystem: fileSystem,
38+
androidSdk: androidSdk,
39+
logger: logger,
40+
verboseHelp: verboseHelp,
41+
)
42+
);
43+
_addSubcommand(BuildApkCommand(logger: logger, verboseHelp: verboseHelp));
44+
_addSubcommand(BuildAppBundleCommand(logger: logger, verboseHelp: verboseHelp));
45+
_addSubcommand(BuildIOSCommand(logger: logger, verboseHelp: verboseHelp));
2846
_addSubcommand(BuildIOSFrameworkCommand(
29-
buildSystem: globals.buildSystem,
47+
logger: logger,
48+
buildSystem: buildSystem,
3049
verboseHelp: verboseHelp,
3150
));
3251
_addSubcommand(BuildMacOSFrameworkCommand(
33-
buildSystem: globals.buildSystem,
52+
logger: logger,
53+
buildSystem: buildSystem,
3454
verboseHelp: verboseHelp,
3555
));
36-
_addSubcommand(BuildIOSArchiveCommand(verboseHelp: verboseHelp));
37-
_addSubcommand(BuildBundleCommand(verboseHelp: verboseHelp));
38-
_addSubcommand(BuildWebCommand(verboseHelp: verboseHelp));
39-
_addSubcommand(BuildMacosCommand(verboseHelp: verboseHelp));
56+
_addSubcommand(BuildIOSArchiveCommand(logger: logger, verboseHelp: verboseHelp));
57+
_addSubcommand(BuildBundleCommand(logger: logger, verboseHelp: verboseHelp));
58+
_addSubcommand(BuildWebCommand(
59+
fileSystem: fileSystem,
60+
logger: logger,
61+
verboseHelp: verboseHelp,
62+
));
63+
_addSubcommand(BuildMacosCommand(logger: logger, verboseHelp: verboseHelp));
4064
_addSubcommand(BuildLinuxCommand(
41-
operatingSystemUtils: globals.os,
65+
logger: logger,
66+
operatingSystemUtils: osUtils,
4267
verboseHelp: verboseHelp
4368
));
44-
_addSubcommand(BuildWindowsCommand(verboseHelp: verboseHelp));
69+
_addSubcommand(BuildWindowsCommand(logger: logger, verboseHelp: verboseHelp));
4570
}
4671

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

6691
abstract class BuildSubCommand extends FlutterCommand {
67-
BuildSubCommand({required bool verboseHelp}) {
92+
BuildSubCommand({
93+
required Logger logger,
94+
required bool verboseHelp
95+
}): _logger = logger {
6896
requiresPubspecYaml();
6997
usesFatalWarningsOption(verboseHelp: verboseHelp);
7098
}
7199

100+
final Logger _logger;
101+
72102
@override
73103
bool get reportNullSafety => true;
74104

@@ -80,21 +110,21 @@ abstract class BuildSubCommand extends FlutterCommand {
80110
/// This is similar to the run message in run_hot.dart
81111
@protected
82112
void displayNullSafetyMode(BuildInfo buildInfo) {
83-
globals.printStatus('');
113+
_logger.printStatus('');
84114
if (buildInfo.nullSafetyMode == NullSafetyMode.sound) {
85-
globals.printStatus(
115+
_logger.printStatus(
86116
'💪 Building with sound null safety 💪',
87117
emphasis: true,
88118
);
89119
} else {
90-
globals.printStatus(
120+
_logger.printStatus(
91121
'Building without sound null safety ⚠️',
92122
emphasis: true,
93123
);
94-
globals.printStatus(
124+
_logger.printStatus(
95125
'Dart 3 will only support sound null safety, see https://dart.dev/null-safety',
96126
);
97127
}
98-
globals.printStatus('');
128+
_logger.printStatus('');
99129
}
100130
}

packages/flutter_tools/lib/src/commands/build_aar.dart

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,28 @@
33
// found in the LICENSE file.
44

55
import '../android/android_builder.dart';
6+
import '../android/android_sdk.dart';
67
import '../android/gradle_utils.dart';
78
import '../base/common.dart';
89

910
import '../base/file_system.dart';
1011
import '../base/os.dart';
1112
import '../build_info.dart';
1213
import '../cache.dart';
13-
import '../globals.dart' as globals;
1414
import '../project.dart';
1515
import '../reporting/reporting.dart';
1616
import '../runner/flutter_command.dart' show FlutterCommandResult;
1717
import 'build.dart';
1818

1919
class BuildAarCommand extends BuildSubCommand {
20-
BuildAarCommand({ required bool verboseHelp }) : super(verboseHelp: verboseHelp) {
20+
BuildAarCommand({
21+
required super.logger,
22+
required AndroidSdk? androidSdk,
23+
required FileSystem fileSystem,
24+
required bool verboseHelp,
25+
}): _androidSdk = androidSdk,
26+
_fileSystem = fileSystem,
27+
super(verboseHelp: verboseHelp) {
2128
argParser
2229
..addFlag(
2330
'debug',
@@ -55,6 +62,8 @@ class BuildAarCommand extends BuildSubCommand {
5562
help: 'The target platform for which the project is compiled.',
5663
);
5764
}
65+
final AndroidSdk? _androidSdk;
66+
final FileSystem _fileSystem;
5867

5968
@override
6069
final String name = 'aar';
@@ -100,7 +109,7 @@ class BuildAarCommand extends BuildSubCommand {
100109

101110
@override
102111
Future<FlutterCommandResult> runCommand() async {
103-
if (globals.androidSdk == null) {
112+
if (_androidSdk == null) {
104113
exitWithNoSdkMessage();
105114
}
106115
final Set<AndroidBuildInfo> androidBuildInfo = <AndroidBuildInfo>{};
@@ -115,7 +124,7 @@ class BuildAarCommand extends BuildSubCommand {
115124
? buildNumberArg
116125
: '1.0';
117126

118-
final File targetFile = globals.fs.file(globals.fs.path.join('lib', 'main.dart'));
127+
final File targetFile = _fileSystem.file(_fileSystem.path.join('lib', 'main.dart'));
119128
for (final String buildMode in const <String>['debug', 'profile', 'release']) {
120129
if (boolArgDeprecated(buildMode)) {
121130
androidBuildInfo.add(
@@ -151,21 +160,21 @@ class BuildAarCommand extends BuildSubCommand {
151160
if (remainingArguments.isEmpty) {
152161
return FlutterProject.current();
153162
}
154-
final File mainFile = globals.fs.file(remainingArguments.first);
163+
final File mainFile = _fileSystem.file(remainingArguments.first);
155164
final String path;
156165
if (!mainFile.existsSync()) {
157-
final Directory pathProject = globals.fs.directory(remainingArguments.first);
166+
final Directory pathProject = _fileSystem.directory(remainingArguments.first);
158167
if (!pathProject.existsSync()) {
159168
throwToolExit('${remainingArguments.first} does not exist');
160169
}
161170
path = pathProject.path;
162171
} else {
163172
path = mainFile.parent.path;
164173
}
165-
final String? projectRoot = findProjectRoot(globals.fs, path);
174+
final String? projectRoot = findProjectRoot(_fileSystem, path);
166175
if (projectRoot == null) {
167176
throwToolExit('${mainFile.parent.path} is not a valid flutter project');
168177
}
169-
return FlutterProject.fromDirectory(globals.fs.directory(projectRoot));
178+
return FlutterProject.fromDirectory(_fileSystem.directory(projectRoot));
170179
}
171180
}

packages/flutter_tools/lib/src/commands/build_apk.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ import '../runner/flutter_command.dart' show FlutterCommandResult;
1414
import 'build.dart';
1515

1616
class BuildApkCommand extends BuildSubCommand {
17-
BuildApkCommand({bool verboseHelp = false}) : super(verboseHelp: verboseHelp) {
17+
BuildApkCommand({
18+
required super.logger, bool verboseHelp = false
19+
}) : super(verboseHelp: verboseHelp) {
1820
addTreeShakeIconsFlag();
1921
usesTargetOption();
2022
addBuildModeFlags(verboseHelp: verboseHelp);

packages/flutter_tools/lib/src/commands/build_appbundle.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import 'build.dart';
1818

1919
class BuildAppBundleCommand extends BuildSubCommand {
2020
BuildAppBundleCommand({
21+
required super.logger,
2122
bool verboseHelp = false,
2223
}) : super(verboseHelp: verboseHelp) {
2324
addTreeShakeIconsFlag();

packages/flutter_tools/lib/src/commands/build_bundle.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import 'build.dart';
1515

1616
class BuildBundleCommand extends BuildSubCommand {
1717
BuildBundleCommand({
18+
required super.logger,
1819
bool verboseHelp = false,
1920
BundleBuilder? bundleBuilder,
2021
}) : _bundleBuilder = bundleBuilder ?? BundleBuilder(), super(verboseHelp: verboseHelp) {

packages/flutter_tools/lib/src/commands/build_ios.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import 'build.dart';
2222
/// Builds an .app for an iOS app to be used for local testing on an iOS device
2323
/// or simulator. Can only be run on a macOS host.
2424
class BuildIOSCommand extends _BuildIOSSubCommand {
25-
BuildIOSCommand({ required super.verboseHelp }) {
25+
BuildIOSCommand({ required super.logger, required super.verboseHelp }) {
2626
argParser
2727
..addFlag('config-only',
2828
help: 'Update the project configuration without performing a build. '
@@ -59,7 +59,7 @@ class BuildIOSCommand extends _BuildIOSSubCommand {
5959
///
6060
/// Can only be run on a macOS host.
6161
class BuildIOSArchiveCommand extends _BuildIOSSubCommand {
62-
BuildIOSArchiveCommand({required super.verboseHelp}) {
62+
BuildIOSArchiveCommand({required super.logger, required super.verboseHelp}) {
6363
argParser.addOption(
6464
'export-method',
6565
defaultsTo: 'app-store',
@@ -293,6 +293,7 @@ class BuildIOSArchiveCommand extends _BuildIOSSubCommand {
293293

294294
abstract class _BuildIOSSubCommand extends BuildSubCommand {
295295
_BuildIOSSubCommand({
296+
required super.logger,
296297
required bool verboseHelp
297298
}) : super(verboseHelp: verboseHelp) {
298299
addTreeShakeIconsFlag();

packages/flutter_tools/lib/src/commands/build_ios_framework.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ abstract class BuildFrameworkCommand extends BuildSubCommand {
3333
required bool verboseHelp,
3434
Cache? cache,
3535
Platform? platform,
36+
required super.logger,
3637
}) : _injectedFlutterVersion = flutterVersion,
3738
_buildSystem = buildSystem,
3839
_injectedCache = cache,
@@ -176,6 +177,7 @@ abstract class BuildFrameworkCommand extends BuildSubCommand {
176177
/// managers.
177178
class BuildIOSFrameworkCommand extends BuildFrameworkCommand {
178179
BuildIOSFrameworkCommand({
180+
required super.logger,
179181
super.flutterVersion,
180182
required super.buildSystem,
181183
required bool verboseHelp,

packages/flutter_tools/lib/src/commands/build_linux.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import 'build.dart';
1717
/// A command to build a linux desktop target through a build shell script.
1818
class BuildLinuxCommand extends BuildSubCommand {
1919
BuildLinuxCommand({
20+
required super.logger,
2021
required OperatingSystemUtils operatingSystemUtils,
2122
bool verboseHelp = false,
2223
}) : _operatingSystemUtils = operatingSystemUtils,

packages/flutter_tools/lib/src/commands/build_macos.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import 'build.dart';
1616
/// A command to build a macOS desktop target through a build shell script.
1717
class BuildMacosCommand extends BuildSubCommand {
1818
BuildMacosCommand({
19+
required super.logger,
1920
required bool verboseHelp,
2021
}) : super(verboseHelp: verboseHelp) {
2122
addCommonDesktopBuildOptions(verboseHelp: verboseHelp);

packages/flutter_tools/lib/src/commands/build_macos_framework.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class BuildMacOSFrameworkCommand extends BuildFrameworkCommand {
2929
super.flutterVersion,
3030
required super.buildSystem,
3131
required super.verboseHelp,
32+
required super.logger,
3233
super.cache,
3334
super.platform,
3435
});

packages/flutter_tools/lib/src/commands/build_web.dart

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
// found in the LICENSE file.
44

55
import '../base/common.dart';
6+
import '../base/file_system.dart';
67
import '../build_info.dart';
78
import '../build_system/targets/web.dart';
89
import '../features.dart';
9-
import '../globals.dart' as globals;
1010
import '../project.dart';
1111
import '../runner/flutter_command.dart'
1212
show DevelopmentArtifact, FlutterCommandResult;
@@ -15,8 +15,10 @@ import 'build.dart';
1515

1616
class BuildWebCommand extends BuildSubCommand {
1717
BuildWebCommand({
18+
required super.logger,
19+
required FileSystem fileSystem,
1820
required bool verboseHelp,
19-
}) : super(verboseHelp: verboseHelp) {
21+
}) : _fileSystem = fileSystem, super(verboseHelp: verboseHelp) {
2022
addTreeShakeIconsFlag(enabledByDefault: false);
2123
usesTargetOption();
2224
usesOutputDir();
@@ -70,6 +72,8 @@ class BuildWebCommand extends BuildSubCommand {
7072
);
7173
}
7274

75+
final FileSystem _fileSystem;
76+
7377
@override
7478
Future<Set<DevelopmentArtifact>> get requiredArtifacts async =>
7579
const <DevelopmentArtifact>{
@@ -103,7 +107,7 @@ class BuildWebCommand extends BuildSubCommand {
103107
if (!flutterProject.web.existsSync()) {
104108
throwToolExit('Missing index.html.');
105109
}
106-
if (!globals.fs.currentDirectory
110+
if (!_fileSystem.currentDirectory
107111
.childDirectory('web')
108112
.childFile('index.html')
109113
.readAsStringSync()

packages/flutter_tools/lib/src/commands/build_windows.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import 'build.dart';
1919
/// A command to build a windows desktop target through a build shell script.
2020
class BuildWindowsCommand extends BuildSubCommand {
2121
BuildWindowsCommand({
22+
required super.logger,
2223
bool verboseHelp = false,
2324
}) : super(verboseHelp: verboseHelp) {
2425
addCommonDesktopBuildOptions(verboseHelp: verboseHelp);

0 commit comments

Comments
 (0)