Skip to content

Commit 69fabb9

Browse files
committed
Fix flavor-conditional asset bundling for path dependencies (flutter#156687)
Fixes flutter#155755 When building the asset bundle during, the `--flavor` option isn't considered when searching for assets from dependencies. This PR fixes that. It's possible that when initially implementing this feature, I thought that flavor-conditional assets didn't make sense for packages. While I still think that way regarding pub packages, using this feature makes a lot more sense for monorepo projects. <details> <summary> Pre-launch checklist </summary> </details>
1 parent 077c008 commit 69fabb9

File tree

2 files changed

+94
-8
lines changed

2 files changed

+94
-8
lines changed

packages/flutter_tools/lib/src/asset.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,7 @@ class ManifestAssetBundle implements AssetBundle {
380380
targetPlatform,
381381
packageName: package.name,
382382
attributedPackage: package,
383+
flavor: flavor,
383384
);
384385

385386
if (packageAssets == null) {
@@ -873,7 +874,7 @@ class ManifestAssetBundle implements AssetBundle {
873874
TargetPlatform? targetPlatform, {
874875
String? packageName,
875876
Package? attributedPackage,
876-
String? flavor,
877+
required String? flavor,
877878
}) {
878879
final Map<_Asset, List<_Asset>> result = <_Asset, List<_Asset>>{};
879880

packages/flutter_tools/test/general.shard/asset_bundle_package_test.dart

Lines changed: 92 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,14 @@ void main() {
2727
return path.replaceAll('/', globals.fs.path.separator);
2828
}
2929

30-
void writePubspecFile(String path, String name, { List<String>? assets }) {
30+
void writePubspecFile(
31+
String path,
32+
String name, {
33+
List<String>? assets,
34+
List<(String path, String flavor)>? flavoredAssets,
35+
}) {
3136
String assetsSection;
32-
if (assets == null) {
37+
if (assets == null && flavoredAssets == null) {
3338
assetsSection = '';
3439
} else {
3540
final StringBuffer buffer = StringBuffer();
@@ -38,11 +43,20 @@ flutter:
3843
assets:
3944
''');
4045

41-
for (final String asset in assets) {
46+
for (final String asset in (assets ?? <String>[])) {
4247
buffer.write('''
4348
- $asset
4449
''');
4550
}
51+
52+
for (final (String path, String flavor) in flavoredAssets ?? <(String, String)>[]) {
53+
buffer.write('''
54+
- path: $path
55+
flavors:
56+
- $flavor
57+
''');
58+
}
59+
4660
assetsSection = buffer.toString();
4761
}
4862

@@ -57,7 +71,7 @@ $assetsSection
5771
''');
5872
}
5973

60-
void writePackageConfigFile(Map<String, String> packages) {
74+
void writePackageConfigFile(Map<String, String> packages) {
6175
globals.fs.directory('.dart_tool').childFile('package_config.json')
6276
..createSync(recursive: true)
6377
..writeAsStringSync(
@@ -89,11 +103,15 @@ void writePackageConfigFile(Map<String, String> packages) {
89103
Future<void> buildAndVerifyAssets(
90104
List<String> assets,
91105
List<String> packages,
92-
Map<Object,Object> expectedAssetManifest
93-
) async {
106+
Map<Object, Object> expectedAssetManifest, {
107+
String? flavor,
108+
}) async {
94109

95110
final AssetBundle bundle = AssetBundleFactory.instance.createBundle();
96-
await bundle.build(packageConfigPath: '.dart_tool/package_config.json');
111+
await bundle.build(
112+
packageConfigPath: '.dart_tool/package_config.json',
113+
flavor: flavor,
114+
);
97115

98116
for (final String packageName in packages) {
99117
for (final String asset in assets) {
@@ -532,6 +550,73 @@ void writePackageConfigFile(Map<String, String> packages) {
532550
FileSystem: () => testFileSystem,
533551
ProcessManager: () => FakeProcessManager.any(),
534552
});
553+
554+
testUsingContext('Flavored assets are bundled when the app depends on a package', () async {
555+
writePubspecFile(
556+
'pubspec.yaml',
557+
'test',
558+
);
559+
writePackageConfigFile(
560+
<String, String>{
561+
'test_package': 'p/p/',
562+
},
563+
);
564+
writePubspecFile(
565+
'p/p/pubspec.yaml',
566+
'test_package',
567+
flavoredAssets: <(String, String)>[('assets/vanilla.txt', 'vanilla')],
568+
);
569+
570+
final List<String> assets = <String>['assets/vanilla.txt'];
571+
writeAssets('p/p', assets);
572+
573+
const Map<Object, Object> expectedAssetManifest = <Object, Object>{
574+
'packages/test_package/assets/vanilla.txt': <Map<String, Object>>[
575+
<String, Object>{'asset': 'packages/test_package/assets/vanilla.txt'},
576+
]
577+
};
578+
579+
await buildAndVerifyAssets(
580+
assets,
581+
<String>['test_package'],
582+
expectedAssetManifest,
583+
flavor: 'vanilla',
584+
);
585+
}, overrides: <Type, Generator>{
586+
FileSystem: () => testFileSystem,
587+
ProcessManager: () => FakeProcessManager.any(),
588+
});
589+
});
590+
591+
testUsingContext('Asset paths can contain URL reserved characters', () async {
592+
writePubspecFile('pubspec.yaml', 'test');
593+
writePackageConfigFile(<String, String>{'test_package': 'p/p/'});
594+
595+
final List<String> assets = <String>['a/foo', 'a/foo [x]'];
596+
writePubspecFile(
597+
'p/p/pubspec.yaml',
598+
'test_package',
599+
assets: assets,
600+
);
601+
602+
writeAssets('p/p/', assets);
603+
const Map<Object, Object> expectedAssetManifest = <Object, Object>{
604+
'packages/test_package/a/foo': <Map<String, Object>>[
605+
<String, Object>{'asset': 'packages/test_package/a/foo'}
606+
],
607+
'packages/test_package/a/foo [x]': <Map<String, Object>>[
608+
<String, Object>{'asset': 'packages/test_package/a/foo [x]'}
609+
]
610+
};
611+
612+
await buildAndVerifyAssets(
613+
assets,
614+
<String>['test_package'],
615+
expectedAssetManifest,
616+
);
617+
}, overrides: <Type, Generator>{
618+
FileSystem: () => testFileSystem,
619+
ProcessManager: () => FakeProcessManager.any(),
535620
});
536621

537622
testUsingContext('Asset paths can contain URL reserved characters', () async {

0 commit comments

Comments
 (0)