[CP-stable]instead of exiting the tool, print a warning when using --flavor with an incompatible device (#143785)
**This pull request is opened against a release branch.<br>
To request a cherry pick of a commit, please fill in the form below.** (Questions with an asterisk are required.)<br>
**To fill in the form, you can edit this PR description and type your answers after the 'My Answer' keywords. <br>
A flutter domain expert will evaluate this cherry pick request shortly after ALL questions are answered.**
* Issue Link: What is the link to the issue this cherry-pick is addressing?<br>
<pre>
<b>My Answer:</b>
https://github.com/flutter/flutter/issues/143574
</pre>
* Changelog Description: Explain this cherry pick in one line that is accessible to most Flutter developers
See https://github.com/flutter/flutter/wiki/Hotfix-Documentation-Best-Practices for examples (Bug fix, feature, docs update, ...)<br>
<pre>
<b>My Answer:</b>
Instead of exiting, the `flutter` CLI tool now prints a warning when the `--flavor` option is used with a target platform that doesn't have flavors support.
</pre>
* impact_description: What is the impact (ex. visual jank on Samsung phones, app crash, cannot ship an iOS app)? Does it impact development (ex. flutter doctor crashes when Android Studio is installed), or the shipping production app (the app crashes on launch)<br>
<pre>
<b>My Answer:</b>
All Flutter devs using the Flavors feature that use their IDE to select a target device.
</pre>
* Workaround: Is there a workaround for this issue?<br>
<pre>
<b>My Answer:</b> Users can create duplicate debug launch configurations for target platforms that do not support the flavors feature.
</pre>
* Risk: What is the risk level of this cherry-pick?<br>
<pre>
<b>My Answer:</b>
</pre>
* Test Coverage: Are you confident that your fix is well-tested by automated tests?<br>
<pre>
<b>My Answer:</b>
</pre>
* Validation Steps: What are the steps to validate that this fix works?<br>
<pre>
<b>My Answer:</b>
Set up a flutter project and configure at least one flavor for it. In VSCode, create a launch configuration that uses `--flavor` to select the flavor you configured (see https://github.com/flutter/flutter/issues/143574#issuecomment-1948284087 for an example). In VSCode, select chrome as the target device and try running the application using the configured launch configuration.
</pre>
diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart
index 45cca98..f16293c 100644
--- a/packages/flutter_tools/lib/src/commands/run.dart
+++ b/packages/flutter_tools/lib/src/commands/run.dart
@@ -615,7 +615,11 @@
final bool flavorsSupportedOnEveryDevice = devices!
.every((Device device) => device.supportsFlavors);
if (flavor != null && !flavorsSupportedOnEveryDevice) {
- throwToolExit('--flavor is only supported for Android, macOS, and iOS devices.');
+ globals.printWarning(
+ '--flavor is only supported for Android, macOS, and iOS devices. '
+ 'Flavor-related features may not function properly and could '
+ 'behave differently in a future release.'
+ );
}
}
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart
index 45473a3..d960096 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart
@@ -48,11 +48,13 @@
});
group('run', () {
+ late BufferLogger logger;
late TestDeviceManager testDeviceManager;
late FileSystem fileSystem;
setUp(() {
- testDeviceManager = TestDeviceManager(logger: BufferLogger.test());
+ logger = BufferLogger.test();
+ testDeviceManager = TestDeviceManager(logger: logger);
fileSystem = MemoryFileSystem.test();
});
@@ -65,7 +67,7 @@
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(),
- Logger: () => BufferLogger.test(),
+ Logger: () => logger,
});
testUsingContext('does not support --no-sound-null-safety by default', () async {
@@ -89,7 +91,7 @@
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(),
- Logger: () => BufferLogger.test(),
+ Logger: () => logger,
});
testUsingContext('supports --no-sound-null-safety with an overridden NonNullSafeBuilds', () async {
@@ -109,7 +111,7 @@
}, overrides: <Type, Generator>{
DeviceManager: () => testDeviceManager,
FileSystem: () => fileSystem,
- Logger: () => BufferLogger.test(),
+ Logger: () => logger,
NonNullSafeBuilds: () => NonNullSafeBuilds.allowed,
ProcessManager: () => FakeProcessManager.any(),
});
@@ -137,7 +139,7 @@
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(),
- Logger: () => BufferLogger.test(),
+ Logger: () => logger,
});
testUsingContext('Walks upward looking for a pubspec.yaml and succeeds if found', () async {
@@ -165,7 +167,7 @@
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(),
- Logger: () => BufferLogger.test(),
+ Logger: () => logger,
});
testUsingContext('Walks upward looking for a pubspec.yaml and exits if missing', () async {
@@ -185,7 +187,7 @@
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(),
- Logger: () => BufferLogger.test(),
+ Logger: () => logger,
});
group('run app', () {
@@ -431,7 +433,7 @@
Cache: () => Cache.test(processManager: FakeProcessManager.any()),
});
- testUsingContext('fails when --flavor is used with an unsupported target platform', () async {
+ testUsingContext('prints warning when --flavor is used with an unsupported target platform', () async {
const List<String> runCommand = <String>[
'run',
'--no-pub',
@@ -440,24 +442,25 @@
'-d',
'all',
];
-
// Useful for test readability.
// ignore: avoid_redundant_argument_values
final FakeDevice deviceWithoutFlavorSupport = FakeDevice(supportsFlavors: false);
final FakeDevice deviceWithFlavorSupport = FakeDevice(supportsFlavors: true);
testDeviceManager.devices = <Device>[deviceWithoutFlavorSupport, deviceWithFlavorSupport];
- await expectLater(
- () => createTestCommandRunner(RunCommand()).run(runCommand),
- throwsToolExit(
- message: '--flavor is only supported for Android, macOS, and iOS devices.',
- ),
- );
+ await createTestCommandRunner(TestRunCommandThatOnlyValidates()).run(runCommand);
+
+ expect(logger.warningText, contains(
+ '--flavor is only supported for Android, macOS, and iOS devices. '
+ 'Flavor-related features may not function properly and could '
+ 'behave differently in a future release.'
+ ));
}, overrides: <Type, Generator>{
DeviceManager: () => testDeviceManager,
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
Cache: () => Cache.test(processManager: FakeProcessManager.any()),
+ Logger: () => logger,
});
testUsingContext('forwards --uninstall-only to DebuggingOptions', () async {
@@ -677,7 +680,7 @@
ProcessManager: () => FakeProcessManager.any(),
Usage: () => usage,
Stdio: () => FakeStdio(),
- Logger: () => AppRunLogger(parent: BufferLogger.test()),
+ Logger: () => AppRunLogger(parent: logger),
});
testUsingContext('can disable devtools with --no-devtools', () async {
@@ -705,7 +708,7 @@
ProcessManager: () => FakeProcessManager.any(),
Usage: () => usage,
Stdio: () => FakeStdio(),
- Logger: () => AppRunLogger(parent: BufferLogger.test()),
+ Logger: () => AppRunLogger(parent: logger),
});
});
});
@@ -1014,7 +1017,7 @@
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(),
- Logger: () => BufferLogger.test(),
+ Logger: () => logger,
DeviceManager: () => testDeviceManager,
});
@@ -1035,7 +1038,7 @@
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(),
- Logger: () => BufferLogger.test(),
+ Logger: () => logger,
DeviceManager: () => testDeviceManager,
});
@@ -1059,7 +1062,7 @@
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(),
- Logger: () => BufferLogger.test(),
+ Logger: () => logger,
DeviceManager: () => testDeviceManager,
});
@@ -1079,7 +1082,7 @@
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(),
- Logger: () => BufferLogger.test(),
+ Logger: () => logger,
DeviceManager: () => testDeviceManager,
});
});