[flutter_tools] update asset manifest to use package_config instead of package_map (#53944)
diff --git a/packages/flutter_tools/lib/src/asset.dart b/packages/flutter_tools/lib/src/asset.dart
index d8db4e0..0a4a146 100644
--- a/packages/flutter_tools/lib/src/asset.dart
+++ b/packages/flutter_tools/lib/src/asset.dart
@@ -5,6 +5,7 @@
import 'dart:async';
import 'package:meta/meta.dart';
+import 'package:package_config/package_config.dart';
import 'package:yaml/yaml.dart';
import 'base/context.dart';
@@ -147,8 +148,16 @@
}
final String assetBasePath = globals.fs.path.dirname(globals.fs.path.absolute(manifestPath));
-
- final PackageMap packageMap = PackageMap(packagesPath, fileSystem: globals.fs);
+ final PackageConfig packageConfig = await loadPackageConfigUri(
+ globals.fs.file(packagesPath).absolute.uri,
+ loader: (Uri uri) {
+ final File file = globals.fs.file(uri);
+ if (!file.existsSync()) {
+ return null;
+ }
+ return file.readAsBytes();
+ },
+ );
final List<Uri> wildcardDirectories = <Uri>[];
// The _assetVariants map contains an entry for each asset listed
@@ -156,7 +165,7 @@
// value of each image asset is a list of resolution-specific "variants",
// see _AssetDirectoryCache.
final Map<_Asset, List<_Asset>> assetVariants = _parseAssets(
- packageMap,
+ packageConfig,
flutterManifest,
wildcardDirectories,
assetBasePath,
@@ -170,14 +179,14 @@
final List<Map<String, dynamic>> fonts = _parseFonts(
flutterManifest,
includeDefaultFonts,
- packageMap,
+ packageConfig,
);
// Add fonts and assets from packages.
- for (final String packageName in packageMap.map.keys) {
- final Uri package = packageMap.map[packageName];
- if (package != null && package.scheme == 'file') {
- final String packageManifestPath = globals.fs.path.fromUri(package.resolve('../pubspec.yaml'));
+ for (final Package package in packageConfig.packages) {
+ final Uri packageUri = package.packageUriRoot;
+ if (packageUri != null && packageUri.scheme == 'file') {
+ final String packageManifestPath = globals.fs.path.fromUri(packageUri.resolve('../pubspec.yaml'));
final FlutterManifest packageFlutterManifest = FlutterManifest.createFromPath(packageManifestPath);
if (packageFlutterManifest == null) {
continue;
@@ -189,11 +198,11 @@
final String packageBasePath = globals.fs.path.dirname(packageManifestPath);
final Map<_Asset, List<_Asset>> packageAssets = _parseAssets(
- packageMap,
+ packageConfig,
packageFlutterManifest,
wildcardDirectories,
packageBasePath,
- packageName: packageName,
+ packageName: package.name,
);
if (packageAssets == null) {
@@ -204,8 +213,8 @@
fonts.addAll(_parseFonts(
packageFlutterManifest,
includeDefaultFonts,
- packageMap,
- packageName: packageName,
+ packageConfig,
+ packageName: package.name,
));
}
}
@@ -253,7 +262,7 @@
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 LicenseResult licenseResult = licenseCollector.obtainLicenses(packageMap);
+ final LicenseResult licenseResult = licenseCollector.obtainLicenses(packageConfig);
entries[_license] = DevFSStringContent(licenseResult.combinedLicenses);
additionalDependencies = licenseResult.dependencies;
@@ -383,18 +392,18 @@
/// Obtain licenses from the `packageMap` into a single result.
LicenseResult obtainLicenses(
- PackageMap packageMap,
+ PackageConfig packageConfig,
) {
final Map<String, Set<String>> packageLicenses = <String, Set<String>>{};
final Set<String> allPackages = <String>{};
final List<File> dependencies = <File>[];
- for (final String packageName in packageMap.map.keys) {
- final Uri package = packageMap.map[packageName];
- if (package == null || package.scheme != 'file') {
+ for (final Package package in packageConfig.packages) {
+ final Uri packageUri = package.packageUriRoot;
+ if (packageUri == null || packageUri.scheme != 'file') {
continue;
}
- final File file = _fileSystem.file(package.resolve('../LICENSE'));
+ final File file = _fileSystem.file(packageUri.resolve('../LICENSE'));
if (!file.existsSync()) {
continue;
}
@@ -414,7 +423,7 @@
}
}
if (licenseText == null) {
- packageNames = <String>[packageName];
+ packageNames = <String>[package.name];
licenseText = rawLicense;
}
packageLicenses.putIfAbsent(licenseText, () => <String>{})
@@ -476,7 +485,7 @@
List<Map<String, dynamic>> _parseFonts(
FlutterManifest manifest,
bool includeDefaultFonts,
- PackageMap packageMap, {
+ PackageConfig packageConfig, {
String packageName,
}) {
return <Map<String, dynamic>>[
@@ -488,7 +497,7 @@
..._createFontsDescriptor(_parsePackageFonts(
manifest,
packageName,
- packageMap,
+ packageConfig,
)),
];
}
@@ -498,7 +507,7 @@
List<Font> _parsePackageFonts(
FlutterManifest manifest,
String packageName,
- PackageMap packageMap,
+ PackageConfig packageConfig,
) {
final List<Font> packageFonts = <Font>[];
for (final Font font in manifest.fonts) {
@@ -506,7 +515,8 @@
for (final FontAsset fontAsset in font.fontAssets) {
final Uri assetUri = fontAsset.assetUri;
if (assetUri.pathSegments.first == 'packages' &&
- !globals.fs.isFileSync(globals.fs.path.fromUri(packageMap.map[packageName].resolve('../${assetUri.path}')))) {
+ !globals.fs.isFileSync(globals.fs.path.fromUri(
+ packageConfig[packageName].packageUriRoot.resolve('../${assetUri.path}')))) {
packageFontAssets.add(FontAsset(
fontAsset.assetUri,
weight: fontAsset.weight,
@@ -605,7 +615,7 @@
///
Map<_Asset, List<_Asset>> _parseAssets(
- PackageMap packageMap,
+ PackageConfig packageConfig,
FlutterManifest flutterManifest,
List<Uri> wildcardDirectories,
String assetBase, {
@@ -618,11 +628,11 @@
for (final Uri assetUri in flutterManifest.assets) {
if (assetUri.toString().endsWith('/')) {
wildcardDirectories.add(assetUri);
- _parseAssetsFromFolder(packageMap, flutterManifest, assetBase,
+ _parseAssetsFromFolder(packageConfig, flutterManifest, assetBase,
cache, result, assetUri,
excludeDirs: excludeDirs, packageName: packageName);
} else {
- _parseAssetFromFile(packageMap, flutterManifest, assetBase,
+ _parseAssetFromFile(packageConfig, flutterManifest, assetBase,
cache, result, assetUri,
excludeDirs: excludeDirs, packageName: packageName);
}
@@ -632,7 +642,7 @@
for (final Font font in flutterManifest.fonts) {
for (final FontAsset fontAsset in font.fontAssets) {
final _Asset baseAsset = _resolveAsset(
- packageMap,
+ packageConfig,
assetBase,
fontAsset.assetUri,
packageName,
@@ -650,7 +660,7 @@
}
void _parseAssetsFromFolder(
- PackageMap packageMap,
+ PackageConfig packageConfig,
FlutterManifest flutterManifest,
String assetBase,
_AssetDirectoryCache cache,
@@ -675,14 +685,14 @@
final Uri uri = Uri.file(relativePath, windows: globals.platform.isWindows);
- _parseAssetFromFile(packageMap, flutterManifest, assetBase, cache, result,
+ _parseAssetFromFile(packageConfig, flutterManifest, assetBase, cache, result,
uri, packageName: packageName);
}
}
}
void _parseAssetFromFile(
- PackageMap packageMap,
+ PackageConfig packageConfig,
FlutterManifest flutterManifest,
String assetBase,
_AssetDirectoryCache cache,
@@ -692,7 +702,7 @@
String packageName,
}) {
final _Asset asset = _resolveAsset(
- packageMap,
+ packageConfig,
assetBase,
assetUri,
packageName,
@@ -718,7 +728,7 @@
}
_Asset _resolveAsset(
- PackageMap packageMap,
+ PackageConfig packageConfig,
String assetsBaseDir,
Uri assetUri,
String packageName,
@@ -727,7 +737,7 @@
if (assetUri.pathSegments.first == 'packages' && !globals.fs.isFileSync(globals.fs.path.join(assetsBaseDir, assetPath))) {
// The asset is referenced in the pubspec.yaml as
// 'packages/PACKAGE_NAME/PATH/TO/ASSET .
- final _Asset packageAsset = _resolvePackageAsset(assetUri, packageMap);
+ final _Asset packageAsset = _resolvePackageAsset(assetUri, packageConfig);
if (packageAsset != null) {
return packageAsset;
}
@@ -742,11 +752,11 @@
);
}
-_Asset _resolvePackageAsset(Uri assetUri, PackageMap packageMap) {
+_Asset _resolvePackageAsset(Uri assetUri, PackageConfig packageConfig) {
assert(assetUri.pathSegments.first == 'packages');
if (assetUri.pathSegments.length > 1) {
final String packageName = assetUri.pathSegments[1];
- final Uri packageUri = packageMap.map[packageName];
+ final Uri packageUri = packageConfig[packageName]?.packageUriRoot;
if (packageUri != null && packageUri.scheme == 'file') {
return _Asset(
baseDir: globals.fs.path.fromUri(packageUri),
diff --git a/packages/flutter_tools/test/general.shard/license_collector_test.dart b/packages/flutter_tools/test/general.shard/license_collector_test.dart
index a41a9a4..a1f5c31 100644
--- a/packages/flutter_tools/test/general.shard/license_collector_test.dart
+++ b/packages/flutter_tools/test/general.shard/license_collector_test.dart
@@ -5,7 +5,9 @@
import 'package:file/memory.dart';
import 'package:flutter_tools/src/asset.dart';
import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/dart/package_map.dart';
+import 'package:flutter_tools/src/convert.dart';
+import 'package:package_config/package_config.dart';
+import 'package:package_config/package_config_types.dart';
import '../src/common.dart';
@@ -246,7 +248,7 @@
licenseCollector = LicenseCollector(fileSystem: fileSystem);
});
- testWithoutContext('processes dependant licenses according to instructions', () {
+ testWithoutContext('processes dependent licenses according to instructions', () async {
fileSystem.file('foo/LICENSE')
..createSync(recursive: true)
..writeAsStringSync(_kMitLicense);
@@ -257,13 +259,34 @@
..createSync(recursive: true)
..writeAsStringSync(_kMitLicense); // intentionally a duplicate
- final PackageMap packageMap = PackageMap.test(<String, Uri>{
- 'foo': Uri.parse('file:///foo/lib/'),
- 'bar': Uri.parse('file:///bar/lib/'),
- 'fizz': Uri.parse('file:///fizz/lib/'),
- }, fileSystem: fileSystem);
-
- final LicenseResult result = licenseCollector.obtainLicenses(packageMap);
+ final File packageConfigFile = fileSystem.file('package_config.json')
+ ..writeAsStringSync(json.encode(
+ <String, Object>{
+ 'configVersion': 2,
+ 'packages': <Object>[
+ <String, Object>{
+ 'name': 'foo',
+ 'rootUri': 'file:///foo/',
+ 'packageUri': 'lib/',
+ 'languageVersion': '2.2'
+ },
+ <String, Object>{
+ 'name': 'bar',
+ 'rootUri': 'file:///bar/',
+ 'packageUri': 'lib/',
+ 'languageVersion': '2.2'
+ },
+ <String, Object>{
+ 'name': 'fizz',
+ 'rootUri': 'file:///fizz/',
+ 'packageUri': 'lib/',
+ 'languageVersion': '2.2'
+ },
+ ],
+ }
+ ));
+ final PackageConfig packageConfig = await loadPackageConfig(packageConfigFile.absolute);
+ final LicenseResult result = licenseCollector.obtainLicenses(packageConfig);
// All included licenses are combined in the result.
expect(result.combinedLicenses, contains(_kApacheLicense));