[flutter_tools] fix recursive asset variant issue (#61129)
Fixes #45075
Fixes #57210
If an asset was included directly from the project root directory, then the same asset when copied to various output or ephemeral directories would also be picked up as an asset variant. This could cause assets to be recursively copied into asset/build/ephemeral directories, as each time it would run it would pick up all of the previous "variants".
The solution is to include project ephemeral directories, in addition to the build directory.
diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart
index db157cd..2b9912a 100644
--- a/packages/flutter_tools/lib/src/device.dart
+++ b/packages/flutter_tools/lib/src/device.dart
@@ -67,46 +67,11 @@
}
/// A class to get all available devices.
-class DeviceManager {
+abstract class DeviceManager {
/// Constructing DeviceManagers is cheap; they only do expensive work if some
/// of their methods are called.
- List<DeviceDiscovery> get deviceDiscoverers => _deviceDiscoverers;
- final List<DeviceDiscovery> _deviceDiscoverers = List<DeviceDiscovery>.unmodifiable(<DeviceDiscovery>[
- AndroidDevices(
- logger: globals.logger,
- androidSdk: globals.androidSdk,
- androidWorkflow: androidWorkflow,
- processManager: globals.processManager,
- ),
- IOSDevices(
- platform: globals.platform,
- xcdevice: globals.xcdevice,
- iosWorkflow: globals.iosWorkflow,
- logger: globals.logger,
- ),
- IOSSimulators(iosSimulatorUtils: globals.iosSimulatorUtils),
- FuchsiaDevices(
- fuchsiaSdk: fuchsiaSdk,
- logger: globals.logger,
- fuchsiaWorkflow: fuchsiaWorkflow,
- platform: globals.platform,
- ),
- FlutterTesterDevices(),
- MacOSDevices(),
- LinuxDevices(
- platform: globals.platform,
- featureFlags: featureFlags,
- ),
- WindowsDevices(),
- WebDevices(
- featureFlags: featureFlags,
- fileSystem: globals.fs,
- platform: globals.platform,
- processManager: globals.processManager,
- logger: globals.logger,
- ),
- ]);
+ List<DeviceDiscovery> get deviceDiscoverers;
String _specifiedDeviceId;
@@ -303,6 +268,45 @@
}
}
+class FlutterDeviceManager extends DeviceManager {
+ @override
+ final List<DeviceDiscovery> deviceDiscoverers = <DeviceDiscovery>[
+ AndroidDevices(
+ logger: globals.logger,
+ androidSdk: globals.androidSdk,
+ androidWorkflow: androidWorkflow,
+ processManager: globals.processManager,
+ ),
+ IOSDevices(
+ platform: globals.platform,
+ xcdevice: globals.xcdevice,
+ iosWorkflow: globals.iosWorkflow,
+ logger: globals.logger,
+ ),
+ IOSSimulators(iosSimulatorUtils: globals.iosSimulatorUtils),
+ FuchsiaDevices(
+ fuchsiaSdk: fuchsiaSdk,
+ logger: globals.logger,
+ fuchsiaWorkflow: fuchsiaWorkflow,
+ platform: globals.platform,
+ ),
+ FlutterTesterDevices(),
+ MacOSDevices(),
+ LinuxDevices(
+ platform: globals.platform,
+ featureFlags: featureFlags,
+ ),
+ WindowsDevices(),
+ WebDevices(
+ featureFlags: featureFlags,
+ fileSystem: globals.fs,
+ platform: globals.platform,
+ processManager: globals.processManager,
+ logger: globals.logger,
+ ),
+ ];
+}
+
/// An abstract class to discover and enumerate a specific type of devices.
abstract class DeviceDiscovery {
bool get supportsPlatform;