Unverified Commit d6cbf259 authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[flutter_tools] don't recreate license, manifest, asset if unchanged (#56107)

Avoid syncing unchanged versions of these files during hot restart/reload. This happens if the asset bundle needs to be built but produces identical manifests/licenses due to only asset contents changing
parent 487954a8
......@@ -260,20 +260,31 @@ class ManifestAssetBundle implements AssetBundle {
_wildcardDirectories[uri] ??= globals.fs.directory(uri);
}
entries[_assetManifestJson] = _createAssetManifest(assetVariants);
entries[kFontManifestJson] = DevFSStringContent(json.encode(fonts));
// TODO(ianh): Only do the following line if we've changed packages or if our LICENSE file changed
final DevFSStringContent assetManifest = _createAssetManifest(assetVariants);
final DevFSStringContent fontManifest = DevFSStringContent(json.encode(fonts));
final LicenseResult licenseResult = licenseCollector.obtainLicenses(packageConfig);
entries[_license] = DevFSStringContent(licenseResult.combinedLicenses);
final DevFSStringContent licenses = DevFSStringContent(licenseResult.combinedLicenses);
additionalDependencies = licenseResult.dependencies;
_setIfChanged(_assetManifestJson, assetManifest);
_setIfChanged(kFontManifestJson, fontManifest);
_setIfChanged(_license, licenses);
return 0;
}
@override
List<File> additionalDependencies = <File>[];
void _setIfChanged(String key, DevFSStringContent content) {
if (!entries.containsKey(key)) {
entries[key] = content;
return;
}
final DevFSStringContent oldContent = entries[key] as DevFSStringContent;
if (oldContent.string != content.string) {
entries[key] = content;
}
}
}
@immutable
......@@ -469,7 +480,7 @@ int _byBasename(_Asset a, _Asset b) {
return a.assetFile.basename.compareTo(b.assetFile.basename);
}
DevFSContent _createAssetManifest(Map<_Asset, List<_Asset>> assetVariants) {
DevFSStringContent _createAssetManifest(Map<_Asset, List<_Asset>> assetVariants) {
final Map<String, List<String>> jsonObject = <String, List<String>>{};
// necessary for making unit tests deterministic
......
......@@ -192,6 +192,37 @@ flutter:
verify(mockDirectory.createSync(recursive: true)).called(1);
expect(testLogger.errorText, contains('ABCD'));
});
testUsingContext('does not unnecessarily recreate asset manifest, font manifest, license', () async {
globals.fs.file('.packages').createSync();
globals.fs.file(globals.fs.path.join('assets', 'foo', 'bar.txt')).createSync(recursive: true);
globals.fs.file('pubspec.yaml')
..createSync()
..writeAsStringSync(r'''
name: example
flutter:
assets:
- assets/foo/bar.txt
''');
final AssetBundle bundle = AssetBundleFactory.instance.createBundle();
await bundle.build(manifestPath: 'pubspec.yaml');
final DevFSStringContent assetManifest = bundle.entries['AssetManifest.json']
as DevFSStringContent;
final DevFSStringContent fontManifest = bundle.entries['FontManifest.json']
as DevFSStringContent;
final DevFSStringContent license = bundle.entries['LICENSE']
as DevFSStringContent;
await bundle.build(manifestPath: 'pubspec.yaml');
expect(assetManifest, bundle.entries['AssetManifest.json']);
expect(fontManifest, bundle.entries['FontManifest.json']);
expect(license, bundle.entries['LICENSE']);
}, overrides: <Type, Generator>{
FileSystem: () => MemoryFileSystem.test(),
ProcessManager: () => FakeProcessManager.any(),
});
}
class MockDirectory extends Mock implements Directory {}
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