Allow empty pubspec file when building asset bundle (#12269)
diff --git a/packages/flutter_tools/lib/src/asset.dart b/packages/flutter_tools/lib/src/asset.dart index b5a1ef8..92bc656 100644 --- a/packages/flutter_tools/lib/src/asset.dart +++ b/packages/flutter_tools/lib/src/asset.dart
@@ -75,13 +75,19 @@ FlutterManifest flutterManifest; try { flutterManifest = await FlutterManifest.createFromPath(manifestPath); - if (flutterManifest == null) - return 1; } catch (e) { printStatus('Error detected in pubspec.yaml:', emphasis: true); printError('$e'); return 1; } + if (flutterManifest == null) + return 1; + + if (flutterManifest.isEmpty) { + entries[_kAssetManifestJson] = new DevFSStringContent('{}'); + return 0; + } + final String assetBasePath = fs.path.dirname(fs.path.absolute(manifestPath)); _lastBuildTimestamp = new DateTime.now();
diff --git a/packages/flutter_tools/lib/src/flutter_manifest.dart b/packages/flutter_tools/lib/src/flutter_manifest.dart index 3c84800..b1bff4b 100644 --- a/packages/flutter_tools/lib/src/flutter_manifest.dart +++ b/packages/flutter_tools/lib/src/flutter_manifest.dart
@@ -26,10 +26,10 @@ static Future<FlutterManifest> _createFromYaml(Object yamlDocument) async { final FlutterManifest pubspec = new FlutterManifest._(); - if (yamlDocument == null || !await _validate(yamlDocument)) + if (yamlDocument != null && !await _validate(yamlDocument)) return null; - pubspec._descriptor = yamlDocument; + pubspec._descriptor = yamlDocument ?? <String, dynamic>{}; pubspec._flutterDescriptor = pubspec._descriptor['flutter'] ?? <String, dynamic>{}; return pubspec; } @@ -40,7 +40,9 @@ /// A map representation of the `flutter` section in the `pubspec.yaml` file. Map<String, dynamic> _flutterDescriptor; - String get appName => _descriptor['name']; + bool get isEmpty => _descriptor.isEmpty; + + String get appName => _descriptor['name'] ?? ''; bool get usesMaterialDesign { return _flutterDescriptor['uses-material-design'] ?? false;
diff --git a/packages/flutter_tools/test/asset_bundle_test.dart b/packages/flutter_tools/test/asset_bundle_test.dart index 0da197e..6f5fe04 100644 --- a/packages/flutter_tools/test/asset_bundle_test.dart +++ b/packages/flutter_tools/test/asset_bundle_test.dart
@@ -5,6 +5,7 @@ import 'dart:convert'; import 'package:file/file.dart'; +import 'package:file/memory.dart'; import 'package:flutter_tools/src/asset.dart'; import 'package:flutter_tools/src/base/file_system.dart'; @@ -80,6 +81,21 @@ expect(await ab.build(), 0); expect(ab.entries.length, greaterThan(0)); }); + + testUsingContext('empty pubspec', () async { + fs.file('pubspec.yaml') + ..createSync() + ..writeAsStringSync(''); + + final AssetBundle bundle = new AssetBundle(); + await bundle.build(manifestPath: 'pubspec.yaml'); + expect(bundle.entries.length, 1); + final String expectedAssetManifest = '{}'; + expect( + UTF8.decode(await bundle.entries['AssetManifest.json'].contentsAsBytes()), + expectedAssetManifest, + ); + }, overrides: <Type, Generator>{FileSystem: () => new MemoryFileSystem(),}); }); }
diff --git a/packages/flutter_tools/test/flutter_manifest_test.dart b/packages/flutter_tools/test/flutter_manifest_test.dart index 2395172..3644ad6 100644 --- a/packages/flutter_tools/test/flutter_manifest_test.dart +++ b/packages/flutter_tools/test/flutter_manifest_test.dart
@@ -16,6 +16,16 @@ }); group('FlutterManifest', () { + testUsingContext('is empty when the pubspec.yaml file is empty', () async { + final FlutterManifest flutterManifest = await FlutterManifest.createFromString(''); + expect(flutterManifest.isEmpty, true); + expect(flutterManifest.appName, ''); + expect(flutterManifest.usesMaterialDesign, false); + expect(flutterManifest.fontsDescriptor, isEmpty); + expect(flutterManifest.fonts, isEmpty); + expect(flutterManifest.assets, isEmpty); + }); + test('has no fonts or assets when the "flutter" section is empty', () async { final String manifest = ''' name: test @@ -25,6 +35,7 @@ '''; final FlutterManifest flutterManifest = await FlutterManifest.createFromString(manifest); expect(flutterManifest, isNotNull); + expect(flutterManifest.isEmpty, false); expect(flutterManifest.appName, 'test'); expect(flutterManifest.usesMaterialDesign, false); expect(flutterManifest.fontsDescriptor, isEmpty);