From 6d1966efccfde0cda63e9248e98db3c588b17d0e Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Mon, 4 May 2020 11:32:30 -0700 Subject: [PATCH] [flutter_tools] make gallery hot reload 5x faster with one neat trick (#56224) --- packages/flutter_tools/lib/src/asset.dart | 6 ++- .../test/general.shard/asset_bundle_test.dart | 43 +++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/packages/flutter_tools/lib/src/asset.dart b/packages/flutter_tools/lib/src/asset.dart index e54eb7fdb81..6250abfd277 100644 --- a/packages/flutter_tools/lib/src/asset.dart +++ b/packages/flutter_tools/lib/src/asset.dart @@ -74,7 +74,8 @@ class ManifestAssetBundle implements AssetBundle { final Map entries = {}; // If an asset corresponds to a wildcard directory, then it may have been - // updated without changes to the manifest. + // updated without changes to the manifest. These are only tracked for + // the current project. final Map _wildcardDirectories = {}; final LicenseCollector licenseCollector = LicenseCollector(fileSystem: globals.fs); @@ -203,7 +204,8 @@ class ManifestAssetBundle implements AssetBundle { final Map<_Asset, List<_Asset>> packageAssets = _parseAssets( packageConfig, packageFlutterManifest, - wildcardDirectories, + // Do not track wildcard directories for dependencies. + [], packageBasePath, packageName: package.name, ); diff --git a/packages/flutter_tools/test/general.shard/asset_bundle_test.dart b/packages/flutter_tools/test/general.shard/asset_bundle_test.dart index eab799880ab..8fbe71f35eb 100644 --- a/packages/flutter_tools/test/general.shard/asset_bundle_test.dart +++ b/packages/flutter_tools/test/general.shard/asset_bundle_test.dart @@ -14,6 +14,7 @@ import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/devfs.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:mockito/mockito.dart'; +import 'package:platform/platform.dart'; import '../src/common.dart'; import '../src/context.dart'; @@ -223,6 +224,48 @@ assets: FileSystem: () => MemoryFileSystem.test(), ProcessManager: () => FakeProcessManager.any(), }); + + testUsingContext('does not track wildcard directories from dependencies', () async { + globals.fs.file('.packages').writeAsStringSync(r''' +example:lib/ +foo:foo/lib/ +'''); + globals.fs.file(globals.fs.path.join('assets', 'foo', 'bar.txt')) + .createSync(recursive: true); + globals.fs.file('pubspec.yaml') + ..createSync() + ..writeAsStringSync(r''' +name: example +dependencies: + foo: any +'''); + globals.fs.file('foo/pubspec.yaml') + ..createSync(recursive: true) + ..writeAsStringSync(r''' +name: foo + +flutter: + assets: + - bar/ +'''); + final AssetBundle bundle = AssetBundleFactory.instance.createBundle(); + globals.fs.file('foo/bar/fizz.txt').createSync(recursive: true); + + await bundle.build(manifestPath: 'pubspec.yaml'); + + expect(bundle.entries, hasLength(4)); + expect(bundle.needsBuild(manifestPath: 'pubspec.yaml'), false); + + // Does not track dependency's wildcard directories. + globals.fs.file(globals.fs.path.join('assets', 'foo', 'bar.txt')) + .deleteSync(); + + expect(bundle.needsBuild(manifestPath: 'pubspec.yaml'), false); + }, overrides: { + FileSystem: () => MemoryFileSystem.test(), + ProcessManager: () => FakeProcessManager.any(), + Platform: () => FakePlatform(operatingSystem: 'linux'), + }); } class MockDirectory extends Mock implements Directory {}