
* make showElapsedTime default to true * support nested progresses * improve hot reload message * rethrow
110 lines
3.9 KiB
Dart
110 lines
3.9 KiB
Dart
import 'dart:async';
|
|
import 'dart:io' as io;
|
|
|
|
import 'package:analyzer/file_system/file_system.dart';
|
|
import 'package:analyzer/file_system/physical_file_system.dart';
|
|
import 'package:analyzer/src/context/builder.dart'; // ignore: implementation_imports
|
|
import 'package:analyzer/src/dart/sdk/sdk.dart'; // ignore: implementation_imports
|
|
import 'package:analyzer/src/generated/engine.dart'; // ignore: implementation_imports
|
|
import 'package:analyzer/src/generated/source.dart'; // ignore: implementation_imports
|
|
import 'package:analyzer/src/summary/summary_file_builder.dart'; // ignore: implementation_imports
|
|
import 'package:analyzer/src/summary/pub_summary.dart'; // ignore: implementation_imports
|
|
import 'package:flutter_tools/src/base/logger.dart';
|
|
import 'package:flutter_tools/src/dart/pub.dart';
|
|
import 'package:flutter_tools/src/globals.dart';
|
|
import 'package:path/path.dart' as pathos;
|
|
import 'package:yaml/src/yaml_node.dart'; // ignore: implementation_imports
|
|
|
|
/// Given the [skyEnginePath], locate corresponding `_embedder.yaml` and compose
|
|
/// the full embedded Dart SDK, and build the [outBundleName] file with its
|
|
/// linked summary.
|
|
void buildSkyEngineSdkSummary(String skyEnginePath, String outBundleName) {
|
|
ResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
|
|
|
|
Map<String, List<Folder>> packageMap = <String, List<Folder>>{
|
|
'sky_engine': <Folder>[
|
|
resourceProvider.getFolder(pathos.join(skyEnginePath, 'lib'))
|
|
]
|
|
};
|
|
|
|
//
|
|
// Read the `_embedder.yaml` file.
|
|
//
|
|
EmbedderYamlLocator yamlLocator = new EmbedderYamlLocator(packageMap);
|
|
Map<Folder, YamlMap> embedderYamls = yamlLocator.embedderYamls;
|
|
if (embedderYamls.length != 1) {
|
|
printError('Exactly one _embedder.yaml was expected in $packageMap, '
|
|
'but $embedderYamls found.');
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Create the EmbedderSdk instance.
|
|
//
|
|
EmbedderSdk sdk = new EmbedderSdk(resourceProvider, embedderYamls);
|
|
sdk.analysisOptions = new AnalysisOptionsImpl()..strongMode = true;
|
|
|
|
//
|
|
// Gather sources.
|
|
//
|
|
List<Source> sources = sdk.uris.map(sdk.mapDartUri).toList();
|
|
|
|
//
|
|
// Build.
|
|
//
|
|
List<int> bytes = new SummaryBuilder(sources, sdk.context, true).build();
|
|
String outputPath = pathos.join(skyEnginePath, outBundleName);
|
|
new io.File(outputPath).writeAsBytesSync(bytes);
|
|
}
|
|
|
|
Future<Null> buildUnlinkedForPackages(String flutterPath) async {
|
|
PhysicalResourceProvider provider = PhysicalResourceProvider.INSTANCE;
|
|
PubSummaryManager manager =
|
|
new PubSummaryManager(provider, '__unlinked_${io.pid}.ds');
|
|
|
|
Folder flutterFolder = provider.getFolder(flutterPath);
|
|
|
|
//
|
|
// Build in packages/.
|
|
//
|
|
Folder packagesFolder = flutterFolder.getChildAssumingFolder('packages');
|
|
await _buildUnlinkedForDirectChildren(manager, packagesFolder);
|
|
|
|
//
|
|
// Build in bin/cache/pkg/.
|
|
//
|
|
Folder pkgFolder = flutterFolder
|
|
.getChildAssumingFolder('bin')
|
|
.getChildAssumingFolder('cache')
|
|
.getChildAssumingFolder('pkg');
|
|
await _buildUnlinkedForDirectChildren(manager, pkgFolder);
|
|
}
|
|
|
|
Future<Null> _buildUnlinkedForDirectChildren(
|
|
PubSummaryManager manager, Folder packagesFolder) async {
|
|
for (Resource child in packagesFolder.getChildren()) {
|
|
if (child is Folder) {
|
|
await _buildUnlinkedForPackage(manager, child);
|
|
}
|
|
}
|
|
}
|
|
|
|
Future<Null> _buildUnlinkedForPackage(
|
|
PubSummaryManager manager, Folder packageFolder) async {
|
|
if (packageFolder.exists) {
|
|
String name = packageFolder.shortName;
|
|
File pubspecFile = packageFolder.getChildAssumingFile('pubspec.yaml');
|
|
Folder libFolder = packageFolder.getChildAssumingFolder('lib');
|
|
if (pubspecFile.exists && libFolder.exists) {
|
|
await pubGet(directory: packageFolder.path);
|
|
Status status =
|
|
logger.startProgress('Building unlinked bundles for $name...');
|
|
try {
|
|
await manager.computeUnlinkedForFolder(name, libFolder);
|
|
} finally {
|
|
status.stop();
|
|
}
|
|
}
|
|
}
|
|
}
|