[flutter_tools] fix package config invalidation (#55420)
diff --git a/packages/flutter_tools/lib/src/run_hot.dart b/packages/flutter_tools/lib/src/run_hot.dart
index 9a2c641..3bbdbbe 100644
--- a/packages/flutter_tools/lib/src/run_hot.dart
+++ b/packages/flutter_tools/lib/src/run_hot.dart
@@ -1270,6 +1270,17 @@
if (updatedAt != null && updatedAt.isAfter(lastCompiled)) {
invalidatedFiles.add(packageUri);
packageConfig = await _createPackageConfig(packagesPath);
+ // The frontend_server might be monitoring the package_config.json file,
+ // Pub should always produce both files.
+ // TODO(jonahwilliams): remove after https://github.com/flutter/flutter/issues/55249
+ if (_fileSystem.path.basename(packagesPath) == '.packages') {
+ final File packageConfigFile = _fileSystem.file(packagesPath)
+ .parent.childDirectory('.dart_tool')
+ .childFile('package_config.json');
+ if (packageConfigFile.existsSync()) {
+ invalidatedFiles.add(packageConfigFile.uri);
+ }
+ }
}
_logger.printTrace(
diff --git a/packages/flutter_tools/test/general.shard/project_file_invalidator_test.dart b/packages/flutter_tools/test/general.shard/project_file_invalidator_test.dart
index 24bb962..cad4dae 100644
--- a/packages/flutter_tools/test/general.shard/project_file_invalidator_test.dart
+++ b/packages/flutter_tools/test/general.shard/project_file_invalidator_test.dart
@@ -5,6 +5,7 @@
import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/logger.dart';
+import 'package:flutter_tools/src/convert.dart';
import 'package:flutter_tools/src/run_hot.dart';
import 'package:package_config/package_config.dart';
@@ -80,6 +81,49 @@
);
});
+ testWithoutContext('Picks up changes to the .packages file and updates package_config.json'
+ ', asyncScanning: $asyncScanning', () async {
+ final DateTime past = DateTime.now().subtract(const Duration(seconds: 1));
+ final FileSystem fileSystem = MemoryFileSystem.test();
+ final PackageConfig packageConfig = PackageConfig.empty;
+ final ProjectFileInvalidator projectFileInvalidator = ProjectFileInvalidator(
+ fileSystem: fileSystem,
+ platform: FakePlatform(),
+ logger: BufferLogger.test(),
+ );
+ fileSystem.file('.packages')
+ .writeAsStringSync('\n');
+ fileSystem.file('.dart_tool/package_config.json')
+ ..createSync(recursive: true)
+ ..writeAsStringSync(json.encode(<String, Object>{
+ 'configVersion': 2,
+ 'packages': <Object>[],
+ }));
+
+ final InvalidationResult invalidationResult = await projectFileInvalidator.findInvalidated(
+ lastCompiled: null,
+ urisToMonitor: <Uri>[],
+ packagesPath: '.packages',
+ asyncScanning: asyncScanning,
+ packageConfig: packageConfig,
+ );
+ expect(invalidationResult.uris, isEmpty);
+ fileSystem.file('.packages').setLastModifiedSync(DateTime.now());
+
+ final InvalidationResult secondInvalidation = await projectFileInvalidator.findInvalidated(
+ lastCompiled: past,
+ urisToMonitor: <Uri>[],
+ packagesPath: '.packages',
+ asyncScanning: asyncScanning,
+ packageConfig: packageConfig,
+ );
+ expect(secondInvalidation.uris, unorderedEquals(<Uri>[
+ Uri.parse('.packages'),
+ Uri.parse('.dart_tool/package_config.json'),
+ ]));
+ });
+
+
testWithoutContext('Picks up changes to the .packages file and updates PackageConfig'
', asyncScanning: $asyncScanning', () async {
final FileSystem fileSystem = MemoryFileSystem.test();