Skip to content

Commit 9492e13

Browse files
authored
Reland [flutter_tools] show only supported sub commands (flutter#86153)
1 parent 93b358f commit 9492e13

File tree

10 files changed

+60
-22
lines changed

10 files changed

+60
-22
lines changed

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

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,25 +24,31 @@ import 'build_winuwp.dart';
2424

2525
class BuildCommand extends FlutterCommand {
2626
BuildCommand({ bool verboseHelp = false }) {
27-
addSubcommand(BuildAarCommand(verboseHelp: verboseHelp));
28-
addSubcommand(BuildApkCommand(verboseHelp: verboseHelp));
29-
addSubcommand(BuildAppBundleCommand(verboseHelp: verboseHelp));
30-
addSubcommand(BuildIOSCommand(verboseHelp: verboseHelp));
31-
addSubcommand(BuildIOSFrameworkCommand(
27+
_addSubcommand(BuildAarCommand(verboseHelp: verboseHelp));
28+
_addSubcommand(BuildApkCommand(verboseHelp: verboseHelp));
29+
_addSubcommand(BuildAppBundleCommand(verboseHelp: verboseHelp));
30+
_addSubcommand(BuildIOSCommand(verboseHelp: verboseHelp));
31+
_addSubcommand(BuildIOSFrameworkCommand(
3232
buildSystem: globals.buildSystem,
3333
verboseHelp: verboseHelp,
3434
));
35-
addSubcommand(BuildIOSArchiveCommand(verboseHelp: verboseHelp));
36-
addSubcommand(BuildBundleCommand(verboseHelp: verboseHelp));
37-
addSubcommand(BuildWebCommand(verboseHelp: verboseHelp));
38-
addSubcommand(BuildMacosCommand(verboseHelp: verboseHelp));
39-
addSubcommand(BuildLinuxCommand(
35+
_addSubcommand(BuildIOSArchiveCommand(verboseHelp: verboseHelp));
36+
_addSubcommand(BuildBundleCommand(verboseHelp: verboseHelp));
37+
_addSubcommand(BuildWebCommand(verboseHelp: verboseHelp));
38+
_addSubcommand(BuildMacosCommand(verboseHelp: verboseHelp));
39+
_addSubcommand(BuildLinuxCommand(
4040
operatingSystemUtils: globals.os,
4141
verboseHelp: verboseHelp
4242
));
43-
addSubcommand(BuildWindowsCommand(verboseHelp: verboseHelp));
44-
addSubcommand(BuildWindowsUwpCommand(verboseHelp: verboseHelp));
45-
addSubcommand(BuildFuchsiaCommand(verboseHelp: verboseHelp));
43+
_addSubcommand(BuildWindowsCommand(verboseHelp: verboseHelp));
44+
_addSubcommand(BuildWindowsUwpCommand(verboseHelp: verboseHelp));
45+
_addSubcommand(BuildFuchsiaCommand(verboseHelp: verboseHelp));
46+
}
47+
48+
void _addSubcommand(BuildSubCommand command) {
49+
if (command.supported) {
50+
addSubcommand(command);
51+
}
4652
}
4753

4854
@override
@@ -63,6 +69,8 @@ abstract class BuildSubCommand extends FlutterCommand {
6369
@override
6470
bool get reportNullSafety => true;
6571

72+
bool get supported => true;
73+
6674
/// Display a message describing the current null safety runtime mode
6775
/// that was selected.
6876
///

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ class BuildFuchsiaCommand extends BuildSubCommand {
5858
@override
5959
String get description => 'Build the Fuchsia target (Experimental).';
6060

61+
@override
62+
bool get supported => globals.platform.isLinux || globals.platform.isMacOS;
63+
6164
@override
6265
Future<FlutterCommandResult> runCommand() async {
6366
if (!featureFlags.isFuchsiaEnabled) {
@@ -68,7 +71,7 @@ class BuildFuchsiaCommand extends BuildSubCommand {
6871
}
6972
final BuildInfo buildInfo = await getBuildInfo();
7073
final FlutterProject flutterProject = FlutterProject.current();
71-
if (!globals.platform.isLinux && !globals.platform.isMacOS) {
74+
if (!supported) {
7275
throwToolExit('"build fuchsia" is only supported on Linux and MacOS hosts.');
7376
}
7477
if (!flutterProject.fuchsia.existsSync()) {

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,12 +224,15 @@ abstract class _BuildIOSSubCommand extends BuildSubCommand {
224224

225225
Directory _outputAppDirectory(String xcodeResultOutput);
226226

227+
@override
228+
bool get supported => globals.platform.isMacOS;
229+
227230
@override
228231
Future<FlutterCommandResult> runCommand() async {
229232
defaultBuildMode = forSimulator ? BuildMode.debug : BuildMode.release;
230233
final BuildInfo buildInfo = await getBuildInfo();
231234

232-
if (!globals.platform.isMacOS) {
235+
if (!supported) {
233236
throwToolExit('Building for iOS is only supported on macOS.');
234237
}
235238
if (forSimulator && !buildInfo.supportsSimulator) {

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,14 @@ class BuildIOSFrameworkCommand extends BuildSubCommand {
141141
return buildInfos;
142142
}
143143

144+
@override
145+
bool get supported => _platform.isMacOS;
146+
144147
@override
145148
Future<void> validateCommand() async {
146149
await super.validateCommand();
147150
_project = FlutterProject.current();
148-
if (!_platform.isMacOS) {
151+
if (!supported) {
149152
throwToolExit('Building frameworks for iOS is only supported on the Mac.');
150153
}
151154

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,17 @@ class BuildMacosCommand extends BuildSubCommand {
3939
@override
4040
String get description => 'Build a macOS desktop application.';
4141

42+
@override
43+
bool get supported => globals.platform.isMacOS;
44+
4245
@override
4346
Future<FlutterCommandResult> runCommand() async {
4447
final BuildInfo buildInfo = await getBuildInfo();
4548
final FlutterProject flutterProject = FlutterProject.current();
4649
if (!featureFlags.isMacOSEnabled) {
4750
throwToolExit('"build macos" is not currently supported. To enable, run "flutter config --enable-macos-desktop".');
4851
}
49-
if (!globals.platform.isMacOS) {
52+
if (!supported) {
5053
throwToolExit('"build macos" only supported on macOS hosts.');
5154
}
5255
displayNullSafetyMode(buildInfo);

packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44

55
// @dart = 2.8
66

7+
import 'package:args/command_runner.dart';
78
import 'package:file/memory.dart';
89
import 'package:file_testing/file_testing.dart';
910
import 'package:flutter_tools/src/base/file_system.dart';
1011
import 'package:flutter_tools/src/base/platform.dart';
1112
import 'package:flutter_tools/src/build_info.dart';
1213
import 'package:flutter_tools/src/cache.dart';
1314
import 'package:flutter_tools/src/commands/build.dart';
15+
import 'package:flutter_tools/src/commands/build_fuchsia.dart';
1416
import 'package:flutter_tools/src/features.dart';
1517
import 'package:flutter_tools/src/fuchsia/fuchsia_kernel_compiler.dart';
1618
import 'package:flutter_tools/src/fuchsia/fuchsia_pm.dart';
@@ -109,9 +111,10 @@ void main() {
109111
final File pubspecFile = fileSystem.file('pubspec.yaml')..createSync();
110112
pubspecFile.writeAsStringSync('name: $appName');
111113

114+
final bool supported = BuildFuchsiaCommand(verboseHelp: false).supported;
112115
expect(
113116
createTestCommandRunner(command).run(const <String>['build', 'fuchsia']),
114-
throwsToolExit(),
117+
supported ? throwsToolExit() : throwsA(isA<UsageException>()),
115118
);
116119
}, overrides: <Type, Generator>{
117120
Platform: () => windowsPlatform,

packages/flutter_tools/test/commands.shard/hermetic/build_ios_test.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44

55
// @dart = 2.8
66

7+
import 'package:args/command_runner.dart';
78
import 'package:file/memory.dart';
89
import 'package:flutter_tools/src/base/file_system.dart';
910
import 'package:flutter_tools/src/base/platform.dart';
1011
import 'package:flutter_tools/src/cache.dart';
1112
import 'package:flutter_tools/src/commands/build.dart';
13+
import 'package:flutter_tools/src/commands/build_ios.dart';
1214
import 'package:flutter_tools/src/ios/xcodeproj.dart';
1315
import 'package:flutter_tools/src/reporting/reporting.dart';
1416

@@ -160,9 +162,10 @@ void main() {
160162
fileSystem.file(fileSystem.path.join('lib', 'main.dart'))
161163
.createSync(recursive: true);
162164

165+
final bool supported = BuildIOSCommand(verboseHelp: false).supported;
163166
expect(createTestCommandRunner(command).run(
164167
const <String>['build', 'ios', '--no-pub']
165-
), throwsToolExit());
168+
), supported ? throwsToolExit() : throwsA(isA<UsageException>()));
166169
}, overrides: <Type, Generator>{
167170
Platform: () => notMacosPlatform,
168171
FileSystem: () => fileSystem,

packages/flutter_tools/test/commands.shard/hermetic/build_ipa_test.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44

55
// @dart = 2.8
66

7+
import 'package:args/command_runner.dart';
78
import 'package:file/memory.dart';
89
import 'package:flutter_tools/src/base/file_system.dart';
910
import 'package:flutter_tools/src/base/logger.dart';
1011
import 'package:flutter_tools/src/base/platform.dart';
1112
import 'package:flutter_tools/src/cache.dart';
1213
import 'package:flutter_tools/src/commands/build.dart';
14+
import 'package:flutter_tools/src/commands/build_ios.dart';
1315
import 'package:flutter_tools/src/ios/xcodeproj.dart';
1416
import 'package:flutter_tools/src/reporting/reporting.dart';
1517

@@ -155,9 +157,10 @@ void main() {
155157
fileSystem.file(fileSystem.path.join('lib', 'main.dart'))
156158
.createSync(recursive: true);
157159

160+
final bool supported = BuildIOSArchiveCommand(verboseHelp: false).supported;
158161
expect(createTestCommandRunner(command).run(
159162
const <String>['build', 'ipa', '--no-pub']
160-
), throwsToolExit());
163+
), supported ? throwsToolExit() : throwsA(isA<UsageException>()));
161164
}, overrides: <Type, Generator>{
162165
Platform: () => notMacosPlatform,
163166
FileSystem: () => fileSystem,

packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ void main() {
149149

150150
expect(createTestCommandRunner(command).run(
151151
const <String>['build', 'macos', '--no-pub']
152-
), throwsToolExit(message: '"build macos" only supported on macOS hosts.'));
152+
), throwsA(isA<UsageException>()));
153153
}, overrides: <Type, Generator>{
154154
Platform: () => notMacosPlatform,
155155
FileSystem: () => fileSystem,
@@ -390,8 +390,9 @@ void main() {
390390
testUsingContext('Refuses to build for macOS when feature is disabled', () {
391391
final CommandRunner<void> runner = createTestCommandRunner(BuildCommand());
392392

393+
final bool supported = BuildMacosCommand(verboseHelp: false).supported;
393394
expect(() => runner.run(<String>['build', 'macos', '--no-pub']),
394-
throwsToolExit());
395+
supported ? throwsToolExit() : throwsA(isA<UsageException>()));
395396
}, overrides: <Type, Generator>{
396397
FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: false),
397398
});

packages/flutter_tools/test/general.shard/commands/build_test.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// @dart = 2.8
66

77
import 'package:args/args.dart';
8+
import 'package:args/command_runner.dart';
89
import 'package:flutter_tools/src/build_info.dart';
910
import 'package:flutter_tools/src/commands/attach.dart';
1011
import 'package:flutter_tools/src/commands/build.dart';
@@ -75,6 +76,13 @@ void main() {
7576
FakeBuildSubCommand().test(sound);
7677
expect(testLogger.statusText, contains('💪 Building with sound null safety 💪'));
7778
});
79+
80+
testUsingContext('Include only supported sub commands', () {
81+
final BuildCommand command = BuildCommand();
82+
for (final Command<void> x in command.subcommands.values) {
83+
expect((x as BuildSubCommand).supported, isTrue);
84+
}
85+
});
7886
}
7987

8088
class FakeBuildSubCommand extends BuildSubCommand {

0 commit comments

Comments
 (0)