mirror of
https://github.com/flutter/flutter
synced 2024-10-13 11:42:54 +00:00
[flutter_tools] prevent wildcard assets from causing build invalidation issues (#56472)
This commit is contained in:
parent
4fd4a7ed85
commit
d0d9da832b
|
@ -272,6 +272,19 @@ class ManifestAssetBundle implements AssetBundle {
|
|||
final DevFSStringContent licenses = DevFSStringContent(licenseResult.combinedLicenses);
|
||||
additionalDependencies = licenseResult.dependencies;
|
||||
|
||||
if (wildcardDirectories.isNotEmpty) {
|
||||
// Force the depfile to contain missing files so that Gradle does not skip
|
||||
// the task. Wildcard directories are not compatible with full incremental
|
||||
// builds. For more context see https://github.com/flutter/flutter/issues/56466 .
|
||||
globals.printTrace(
|
||||
'Manifest contained wildcard assets. Inserting missing file into '
|
||||
'build graph to force rerun. for more information see #56466.'
|
||||
);
|
||||
final int suffix = Object().hashCode;
|
||||
additionalDependencies.add(
|
||||
globals.fs.file('DOES_NOT_EXIST_RERUN_FOR_WILDCARD$suffix').absolute);
|
||||
}
|
||||
|
||||
_setIfChanged(_assetManifestJson, assetManifest);
|
||||
_setIfChanged(kFontManifestJson, fontManifest);
|
||||
_setIfChanged(_license, licenses);
|
||||
|
|
|
@ -224,6 +224,83 @@ assets:
|
|||
ProcessManager: () => FakeProcessManager.any(),
|
||||
});
|
||||
|
||||
testUsingContext('inserts dummy file into additionalDependencies when '
|
||||
'wildcards are used', () async {
|
||||
globals.fs.file('.packages').createSync();
|
||||
globals.fs.file(globals.fs.path.join('assets', 'bar.txt')).createSync(recursive: true);
|
||||
globals.fs.file('pubspec.yaml')
|
||||
..createSync()
|
||||
..writeAsStringSync(r'''
|
||||
name: example
|
||||
flutter:
|
||||
assets:
|
||||
- assets/
|
||||
''');
|
||||
final AssetBundle bundle = AssetBundleFactory.instance.createBundle();
|
||||
|
||||
expect(await bundle.build(manifestPath: 'pubspec.yaml'), 0);
|
||||
expect(bundle.additionalDependencies.single.path, contains('DOES_NOT_EXIST_RERUN_FOR_WILDCARD'));
|
||||
}, overrides: <Type, Generator>{
|
||||
FileSystem: () => MemoryFileSystem.test(),
|
||||
ProcessManager: () => FakeProcessManager.any(),
|
||||
});
|
||||
|
||||
testUsingContext('Does not insert dummy file into additionalDependencies '
|
||||
'when wildcards are not used', () async {
|
||||
globals.fs.file('.packages').createSync();
|
||||
globals.fs.file(globals.fs.path.join('assets', 'bar.txt')).createSync(recursive: true);
|
||||
globals.fs.file('pubspec.yaml')
|
||||
..createSync()
|
||||
..writeAsStringSync(r'''
|
||||
name: example
|
||||
flutter:
|
||||
assets:
|
||||
- assets/bar.txt
|
||||
''');
|
||||
final AssetBundle bundle = AssetBundleFactory.instance.createBundle();
|
||||
|
||||
expect(await bundle.build(manifestPath: 'pubspec.yaml'), 0);
|
||||
expect(bundle.additionalDependencies, isEmpty);
|
||||
}, overrides: <Type, Generator>{
|
||||
FileSystem: () => MemoryFileSystem.test(),
|
||||
ProcessManager: () => FakeProcessManager.any(),
|
||||
});
|
||||
|
||||
testUsingContext('Does not insert dummy file into additionalDependencies '
|
||||
'when wildcards are used by 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);
|
||||
|
||||
expect(await bundle.build(manifestPath: 'pubspec.yaml'), 0);
|
||||
expect(bundle.additionalDependencies, isEmpty);
|
||||
}, overrides: <Type, Generator>{
|
||||
FileSystem: () => MemoryFileSystem.test(),
|
||||
ProcessManager: () => FakeProcessManager.any(),
|
||||
Platform: () => FakePlatform(operatingSystem: 'linux'),
|
||||
});
|
||||
|
||||
testUsingContext('does not track wildcard directories from dependencies', () async {
|
||||
globals.fs.file('.packages').writeAsStringSync(r'''
|
||||
example:lib/
|
||||
|
|
Loading…
Reference in a new issue