Unverified Commit 6d37867c authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

Place hot reload artifacts in a temp directory (#40171)

parent 963c8a89
...@@ -536,34 +536,33 @@ abstract class ResidentRunner { ...@@ -536,34 +536,33 @@ abstract class ResidentRunner {
this.ipv6, this.ipv6,
this.stayResident = true, this.stayResident = true,
this.hotMode = true, this.hotMode = true,
this.dillOutputPath, String dillOutputPath,
}) : mainPath = findMainDartFile(target), }) : mainPath = findMainDartFile(target),
projectRootPath = projectRootPath ?? fs.currentDirectory.path, projectRootPath = projectRootPath ?? fs.currentDirectory.path,
packagesFilePath = packagesFilePath ?? fs.path.absolute(PackageMap.globalPackagesPath), packagesFilePath = packagesFilePath ?? fs.path.absolute(PackageMap.globalPackagesPath),
_dillOutputPath = dillOutputPath,
artifactDirectory = dillOutputPath == null
? fs.systemTempDirectory.createTempSync('_fluttter_tool')
: fs.file(dillOutputPath).parent,
assetBundle = AssetBundleFactory.instance.createBundle() { assetBundle = AssetBundleFactory.instance.createBundle() {
// TODO(jonahwilliams): this is transitionary logic to allow us to support if (!artifactDirectory.existsSync()) {
// platforms that are not yet using flutter assemble. In the "new world", artifactDirectory.createSync(recursive: true);
// builds are isolated based on a number of factors. Thus, we cannot assume
// that a debug build will create the expected `build/app.dill` file. For
// now, I'm working around this by just creating it if it is missing here.
// In the future, once build & run are more strongly separated, the build
// environment will be plumbed through so that it all comes from a single
// source of truth, the [Environment].
final File dillOutput = fs.file(dillOutputPath ?? fs.path.join('build', 'app.dill'));
if (!dillOutput.existsSync()) {
dillOutput.createSync(recursive: true);
} }
} }
@protected @protected
@visibleForTesting @visibleForTesting
final List<FlutterDevice> flutterDevices; final List<FlutterDevice> flutterDevices;
final String target; final String target;
final DebuggingOptions debuggingOptions; final DebuggingOptions debuggingOptions;
final bool stayResident; final bool stayResident;
final bool ipv6; final bool ipv6;
final String _dillOutputPath;
/// The parent location of the incremental artifacts.
@visibleForTesting
final Directory artifactDirectory;
final Completer<int> _finished = Completer<int>(); final Completer<int> _finished = Completer<int>();
final String dillOutputPath;
final String packagesFilePath; final String packagesFilePath;
final String projectRootPath; final String projectRootPath;
final String mainPath; final String mainPath;
...@@ -571,6 +570,8 @@ abstract class ResidentRunner { ...@@ -571,6 +570,8 @@ abstract class ResidentRunner {
bool _exited = false; bool _exited = false;
bool hotMode ; bool hotMode ;
String get dillOutputPath => _dillOutputPath ?? fs.path.join(artifactDirectory.path, 'app.dill');
String getReloadPath({ bool fullRestart }) => mainPath + (fullRestart ? '' : '.incremental') + '.dill'; String getReloadPath({ bool fullRestart }) => mainPath + (fullRestart ? '' : '.incremental') + '.dill';
bool get debuggingEnabled => debuggingOptions.debuggingEnabled; bool get debuggingEnabled => debuggingOptions.debuggingEnabled;
...@@ -716,6 +717,7 @@ abstract class ResidentRunner { ...@@ -716,6 +717,7 @@ abstract class ResidentRunner {
/// Throws an [AssertionError] if [Devce.supportsScreenshot] is not true. /// Throws an [AssertionError] if [Devce.supportsScreenshot] is not true.
Future<void> screenshot(FlutterDevice device) async { Future<void> screenshot(FlutterDevice device) async {
assert(device.device.supportsScreenshot); assert(device.device.supportsScreenshot);
final Status status = logger.startProgress('Taking screenshot for ${device.device.name}...', timeout: timeoutConfiguration.fastOperation); final Status status = logger.startProgress('Taking screenshot for ${device.device.name}...', timeout: timeoutConfiguration.fastOperation);
final File outputFile = getUniqueFile(fs.currentDirectory, 'flutter', 'png'); final File outputFile = getUniqueFile(fs.currentDirectory, 'flutter', 'png');
try { try {
...@@ -850,7 +852,13 @@ abstract class ResidentRunner { ...@@ -850,7 +852,13 @@ abstract class ResidentRunner {
return exitCode; return exitCode;
} }
Future<void> preExit() async { } @mustCallSuper
Future<void> preExit() async {
// If _dillOutputPath is null, we created a temporary directory for the dill.
if (_dillOutputPath == null && artifactDirectory.existsSync()) {
artifactDirectory.deleteSync(recursive: true);
}
}
Future<void> exitApp() async { Future<void> exitApp() async {
final List<Future<void>> futures = <Future<void>>[]; final List<Future<void>> futures = <Future<void>>[];
......
...@@ -206,5 +206,6 @@ class ColdRunner extends ResidentRunner { ...@@ -206,5 +206,6 @@ class ColdRunner extends ResidentRunner {
if (device.vmServices == null || device.vmServices.isEmpty) if (device.vmServices == null || device.vmServices.isEmpty)
await device.device.stopApp(device.package); await device.device.stopApp(device.package);
} }
await super.preExit();
} }
} }
...@@ -1010,6 +1010,7 @@ class HotRunner extends ResidentRunner { ...@@ -1010,6 +1010,7 @@ class HotRunner extends ResidentRunner {
Future<void> preExit() async { Future<void> preExit() async {
await _cleanupDevFS(); await _cleanupDevFS();
await hotRunnerConfig.runPreShutdownOperations(); await hotRunnerConfig.runPreShutdownOperations();
await super.preExit();
} }
@override @override
......
...@@ -298,6 +298,20 @@ void main() { ...@@ -298,6 +298,20 @@ void main() {
Usage: () => MockUsage(), Usage: () => MockUsage(),
})); }));
test('ResidentRunner uses temp directory when there is no output dill path', () => testbed.run(() {
expect(residentRunner.artifactDirectory.path, contains('_fluttter_tool'));
final ResidentRunner otherRunner = HotRunner(
<FlutterDevice>[
mockFlutterDevice,
],
stayResident: false,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
dillOutputPath: fs.path.join('foobar', 'app.dill'),
);
expect(otherRunner.artifactDirectory.path, contains('foobar'));
}));
test('ResidentRunner printHelpDetails', () => testbed.run(() { test('ResidentRunner printHelpDetails', () => testbed.run(() {
when(mockDevice.supportsHotRestart).thenReturn(true); when(mockDevice.supportsHotRestart).thenReturn(true);
when(mockDevice.supportsScreenshot).thenReturn(true); when(mockDevice.supportsScreenshot).thenReturn(true);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment