mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
Add to Artifacts, and add optional arguments to entry points for flut… (#15185)
Add to Artifacts, and add optional arguments to entry points for flutter run and test to allow for wiring up the same with preview-dart-2 internally
This commit is contained in:
parent
dba9584ba1
commit
e0f6e626e9
@ -26,6 +26,7 @@ enum Artifact {
|
||||
flutterPatchedSdkPath,
|
||||
frontendServerSnapshotForEngineDartSdk,
|
||||
engineDartSdkPath,
|
||||
engineDartBinary,
|
||||
}
|
||||
|
||||
String _artifactToFileName(Artifact artifact) {
|
||||
@ -57,6 +58,8 @@ String _artifactToFileName(Artifact artifact) {
|
||||
return 'dart-sdk';
|
||||
case Artifact.frontendServerSnapshotForEngineDartSdk:
|
||||
return 'frontend_server.dart.snapshot';
|
||||
case Artifact.engineDartBinary:
|
||||
return 'dart';
|
||||
}
|
||||
assert(false, 'Invalid artifact $artifact.');
|
||||
return null;
|
||||
@ -170,6 +173,8 @@ class CachedArtifacts extends Artifacts {
|
||||
return fs.path.join(engineArtifactsPath, platformDirName, _artifactToFileName(artifact));
|
||||
case Artifact.engineDartSdkPath:
|
||||
return dartSdkPath;
|
||||
case Artifact.engineDartBinary:
|
||||
return fs.path.join(dartSdkPath,'bin', _artifactToFileName(artifact));
|
||||
case Artifact.platformKernelDill:
|
||||
return fs.path.join(_getFlutterPatchedSdkPath(), _artifactToFileName(artifact));
|
||||
case Artifact.platformLibrariesJson:
|
||||
@ -252,6 +257,8 @@ class LocalEngineArtifacts extends Artifacts {
|
||||
return fs.path.join(_hostEngineOutPath, 'gen', _artifactToFileName(artifact));
|
||||
case Artifact.engineDartSdkPath:
|
||||
return fs.path.join(_hostEngineOutPath, 'dart-sdk');
|
||||
case Artifact.engineDartBinary:
|
||||
return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', _artifactToFileName(artifact));
|
||||
}
|
||||
assert(false, 'Invalid artifact $artifact.');
|
||||
return null;
|
||||
|
@ -357,6 +357,7 @@ class AppDomain extends Domain {
|
||||
@required bool trackWidgetCreation,
|
||||
String projectRootPath,
|
||||
String packagesFilePath,
|
||||
String dillOutputPath,
|
||||
bool ipv6: false,
|
||||
}) async {
|
||||
if (await device.isLocalEmulator && !options.buildInfo.supportsEmulator) {
|
||||
@ -371,6 +372,7 @@ class AppDomain extends Domain {
|
||||
device,
|
||||
previewDart2: options.buildInfo.previewDart2,
|
||||
trackWidgetCreation: trackWidgetCreation,
|
||||
dillOutputPath: dillOutputPath,
|
||||
);
|
||||
|
||||
ResidentRunner runner;
|
||||
@ -384,6 +386,7 @@ class AppDomain extends Domain {
|
||||
applicationBinary: applicationBinary,
|
||||
projectRootPath: projectRootPath,
|
||||
packagesFilePath: packagesFilePath,
|
||||
dillOutputPath: dillOutputPath,
|
||||
ipv6: ipv6,
|
||||
hostIsIde: true,
|
||||
);
|
||||
|
@ -147,6 +147,10 @@ class RunCommand extends RunCommandBase {
|
||||
'results out to "refresh_benchmark.json", and exit. This flag is\n'
|
||||
'intended for use in generating automated flutter benchmarks.');
|
||||
|
||||
argParser.addOption('output-dill',
|
||||
hide: !verboseHelp,
|
||||
help: 'Specify the path to frontend server output kernel file.');
|
||||
|
||||
argParser.addOption(FlutterOptions.kExtraFrontEndOptions, hide: true);
|
||||
argParser.addOption(FlutterOptions.kExtraGenSnapshotOptions, hide: true);
|
||||
}
|
||||
@ -262,6 +266,7 @@ class RunCommand extends RunCommandBase {
|
||||
trackWidgetCreation: argResults['track-widget-creation'],
|
||||
projectRootPath: argResults['project-root'],
|
||||
packagesFilePath: globalResults['packages'],
|
||||
dillOutputPath: argResults['output-dill'],
|
||||
ipv6: ipv6,
|
||||
);
|
||||
} catch (error) {
|
||||
@ -301,6 +306,7 @@ class RunCommand extends RunCommandBase {
|
||||
device,
|
||||
previewDart2: argResults['preview-dart-2'],
|
||||
trackWidgetCreation: argResults['track-widget-creation'],
|
||||
dillOutputPath: argResults['output-dill'],
|
||||
);
|
||||
}).toList();
|
||||
|
||||
@ -314,6 +320,7 @@ class RunCommand extends RunCommandBase {
|
||||
applicationBinary: argResults['use-application-binary'],
|
||||
projectRootPath: argResults['project-root'],
|
||||
packagesFilePath: globalResults['packages'],
|
||||
dillOutputPath: argResults['output-dill'],
|
||||
stayResident: stayResident,
|
||||
ipv6: ipv6,
|
||||
);
|
||||
|
@ -8,24 +8,10 @@ import 'dart:convert';
|
||||
import 'package:usage/uuid/uuid.dart';
|
||||
|
||||
import 'artifacts.dart';
|
||||
import 'base/common.dart';
|
||||
import 'base/file_system.dart';
|
||||
import 'base/io.dart';
|
||||
import 'base/process_manager.dart';
|
||||
import 'globals.dart';
|
||||
|
||||
String _dartExecutable() {
|
||||
final String engineDartSdkPath = artifacts.getArtifactPath(
|
||||
Artifact.engineDartSdkPath
|
||||
);
|
||||
if (!fs.isDirectorySync(engineDartSdkPath)) {
|
||||
throwToolExit('No dart sdk Flutter host engine build found at $engineDartSdkPath.\n'
|
||||
'Note that corresponding host engine build is required even when targeting particular device platforms.',
|
||||
exitCode: 2);
|
||||
}
|
||||
return fs.path.join(engineDartSdkPath, 'bin', 'dart');
|
||||
}
|
||||
|
||||
class _StdoutHandler {
|
||||
_StdoutHandler() {
|
||||
reset();
|
||||
@ -74,7 +60,7 @@ Future<String> compile(
|
||||
if (!sdkRoot.endsWith('/'))
|
||||
sdkRoot = '$sdkRoot/';
|
||||
final List<String> command = <String>[
|
||||
_dartExecutable(),
|
||||
artifacts.getArtifactPath(Artifact.engineDartBinary),
|
||||
frontendServer,
|
||||
'--sdk-root',
|
||||
sdkRoot,
|
||||
@ -154,13 +140,13 @@ class ResidentCompiler {
|
||||
/// Binary file name is returned if compilation was successful, otherwise
|
||||
/// null is returned.
|
||||
Future<String> recompile(String mainPath, List<String> invalidatedFiles,
|
||||
{String outputPath}) async {
|
||||
{String outputPath, String packagesFilePath}) async {
|
||||
stdoutHandler.reset();
|
||||
|
||||
// First time recompile is called we actually have to compile the app from
|
||||
// scratch ignoring list of invalidated files.
|
||||
if (_server == null)
|
||||
return _compile(mainPath, outputPath);
|
||||
return _compile(mainPath, outputPath, packagesFilePath);
|
||||
|
||||
final String inputKey = new Uuid().generateV4();
|
||||
_server.stdin.writeln('recompile ${mainPath != null ? mainPath + " ": ""}$inputKey');
|
||||
@ -170,12 +156,12 @@ class ResidentCompiler {
|
||||
return stdoutHandler.outputFilename.future;
|
||||
}
|
||||
|
||||
Future<String> _compile(String scriptFilename, String outputPath) async {
|
||||
Future<String> _compile(String scriptFilename, String outputPath, String packagesFilePath) async {
|
||||
final String frontendServer = artifacts.getArtifactPath(
|
||||
Artifact.frontendServerSnapshotForEngineDartSdk
|
||||
);
|
||||
final List<String> args = <String>[
|
||||
_dartExecutable(),
|
||||
artifacts.getArtifactPath(Artifact.engineDartBinary),
|
||||
frontendServer,
|
||||
'--sdk-root',
|
||||
_sdkRoot,
|
||||
@ -186,6 +172,9 @@ class ResidentCompiler {
|
||||
if (outputPath != null) {
|
||||
args.addAll(<String>['--output-dill', outputPath]);
|
||||
}
|
||||
if (packagesFilePath != null) {
|
||||
args.addAll(<String>['--packages', packagesFilePath]);
|
||||
}
|
||||
if (_trackWidgetCreation) {
|
||||
args.add('--track-widget-creation');
|
||||
}
|
||||
|
@ -407,6 +407,7 @@ class DevFS {
|
||||
bool bundleDirty: false,
|
||||
Set<String> fileFilter,
|
||||
ResidentCompiler generator,
|
||||
String dillOutputPath,
|
||||
bool fullRestart: false,
|
||||
}) async {
|
||||
// Mark all entries as possibly deleted.
|
||||
@ -500,7 +501,8 @@ class DevFS {
|
||||
}
|
||||
final String compiledBinary =
|
||||
await generator.recompile(mainPath, invalidatedFiles,
|
||||
outputPath: fs.path.join(getBuildDirectory(), 'app.dill'));
|
||||
outputPath: dillOutputPath ?? fs.path.join(getBuildDirectory(), 'app.dill'),
|
||||
packagesFilePath : _packagesFilePath);
|
||||
if (compiledBinary != null && compiledBinary.isNotEmpty)
|
||||
dirtyEntries.putIfAbsent(
|
||||
Uri.parse(target + '.dill'),
|
||||
|
@ -35,12 +35,14 @@ class FlutterDevice {
|
||||
DevFS devFS;
|
||||
ApplicationPackage package;
|
||||
ResidentCompiler generator;
|
||||
String dillOutputPath;
|
||||
|
||||
StreamSubscription<String> _loggingSubscription;
|
||||
|
||||
FlutterDevice(this.device, {
|
||||
@required bool previewDart2,
|
||||
@required bool trackWidgetCreation,
|
||||
this.dillOutputPath,
|
||||
}) {
|
||||
if (previewDart2) {
|
||||
generator = new ResidentCompiler(
|
||||
@ -386,7 +388,8 @@ class FlutterDevice {
|
||||
bundleDirty: bundleDirty,
|
||||
fileFilter: fileFilter,
|
||||
generator: generator,
|
||||
fullRestart: fullRestart
|
||||
fullRestart: fullRestart,
|
||||
dillOutputPath: dillOutputPath,
|
||||
);
|
||||
} on DevFSException {
|
||||
devFSStatus.cancel();
|
||||
|
@ -42,6 +42,7 @@ class HotRunner extends ResidentRunner {
|
||||
this.hostIsIde: false,
|
||||
String projectRootPath,
|
||||
String packagesFilePath,
|
||||
this.dillOutputPath,
|
||||
bool stayResident: true,
|
||||
bool ipv6: false,
|
||||
}) : super(devices,
|
||||
@ -57,6 +58,7 @@ class HotRunner extends ResidentRunner {
|
||||
final String applicationBinary;
|
||||
final bool hostIsIde;
|
||||
Set<String> _dartDependencies;
|
||||
final String dillOutputPath;
|
||||
|
||||
final Map<String, List<int>> benchmarkData = <String, List<int>>{};
|
||||
// The initial launch is from a snapshot.
|
||||
@ -334,7 +336,12 @@ class HotRunner extends ResidentRunner {
|
||||
for (FlutterDevice device in flutterDevices) {
|
||||
final Uri deviceEntryUri = device.devFS.baseUri.resolveUri(
|
||||
fs.path.toUri(entryUri));
|
||||
final Uri devicePackagesUri = device.devFS.baseUri.resolve('.packages');
|
||||
Uri devicePackagesUri;
|
||||
if (packagesFilePath != null) {
|
||||
devicePackagesUri = fs.path.toUri(packagesFilePath);
|
||||
} else {
|
||||
devicePackagesUri = device.devFS.baseUri.resolve('.packages');
|
||||
}
|
||||
final Uri deviceAssetsDirectoryUri = device.devFS.baseUri.resolveUri(
|
||||
fs.path.toUri(getAssetBuildDirectory()));
|
||||
await _launchInView(device,
|
||||
@ -389,7 +396,10 @@ class HotRunner extends ResidentRunner {
|
||||
}
|
||||
// We are now running from source.
|
||||
_runningFromSnapshot = false;
|
||||
await _launchFromDevFS(debuggingOptions.buildInfo.previewDart2 ? mainPath + '.dill' : mainPath);
|
||||
final String launchPath = debuggingOptions.buildInfo.previewDart2
|
||||
? dillOutputPath ?? mainPath + '.dill'
|
||||
: mainPath;
|
||||
await _launchFromDevFS(launchPath);
|
||||
restartTimer.stop();
|
||||
printTrace('Restart performed in '
|
||||
'${getElapsedAsMilliseconds(restartTimer.elapsed)}.');
|
||||
|
@ -59,6 +59,8 @@ void installHook({
|
||||
bool machine: false,
|
||||
bool startPaused: false,
|
||||
bool previewDart2: false,
|
||||
int port: 0,
|
||||
String dillFilePath,
|
||||
int observatoryPort,
|
||||
InternetAddressType serverType: InternetAddressType.IP_V4,
|
||||
}) {
|
||||
@ -75,6 +77,8 @@ void installHook({
|
||||
explicitObservatoryPort: observatoryPort,
|
||||
host: _kHosts[serverType],
|
||||
previewDart2: previewDart2,
|
||||
port: port,
|
||||
dillFilePath: dillFilePath,
|
||||
),
|
||||
);
|
||||
}
|
||||
@ -100,6 +104,8 @@ class _FlutterPlatform extends PlatformPlugin {
|
||||
this.explicitObservatoryPort,
|
||||
this.host,
|
||||
this.previewDart2,
|
||||
this.port,
|
||||
this.dillFilePath,
|
||||
}) : assert(shellPath != null) {
|
||||
compilerController.stream.listen((CompilationRequest request) async {
|
||||
final bool isEmpty = compilationQueue.isEmpty;
|
||||
@ -133,6 +139,8 @@ class _FlutterPlatform extends PlatformPlugin {
|
||||
final int explicitObservatoryPort;
|
||||
final InternetAddress host;
|
||||
final bool previewDart2;
|
||||
final int port;
|
||||
final String dillFilePath;
|
||||
final StreamController<CompilationRequest> compilerController =
|
||||
new StreamController<CompilationRequest>();
|
||||
ResidentCompiler compiler =
|
||||
@ -193,7 +201,7 @@ class _FlutterPlatform extends PlatformPlugin {
|
||||
controller.sink.done.whenComplete(() { controllerSinkClosed = true; }); // ignore: unawaited_futures
|
||||
|
||||
// Prepare our WebSocket server to talk to the engine subproces.
|
||||
final HttpServer server = await HttpServer.bind(host, 0);
|
||||
final HttpServer server = await HttpServer.bind(host, port);
|
||||
finalizers.add(() async {
|
||||
printTrace('test $ourTestCount: shutting down test harness socket server');
|
||||
await server.close(force: true);
|
||||
@ -218,56 +226,71 @@ class _FlutterPlatform extends PlatformPlugin {
|
||||
);
|
||||
|
||||
// Prepare a temporary directory to store the Dart file that will talk to us.
|
||||
final Directory temporaryDirectory = fs.systemTempDirectory.createTempSync('dart_test_listener');
|
||||
finalizers.add(() async {
|
||||
printTrace('test $ourTestCount: deleting temporary directory');
|
||||
temporaryDirectory.deleteSync(recursive: true);
|
||||
});
|
||||
|
||||
// Prepare the Dart file that will talk to us and start the test.
|
||||
final File listenerFile = fs.file('${temporaryDirectory.path}/listener.dart');
|
||||
listenerFile.createSync();
|
||||
listenerFile.writeAsStringSync(_generateTestMain(
|
||||
testUrl: fs.path.toUri(fs.path.absolute(testPath)).toString(),
|
||||
encodedWebsocketUrl: Uri.encodeComponent(_getWebSocketUrl(server)),
|
||||
));
|
||||
// If a kernel file is given, then use that to launch the test.
|
||||
File listenerFile;
|
||||
if (dillFilePath == null) {
|
||||
final Directory temporaryDirectory = fs.systemTempDirectory
|
||||
.createTempSync('dart_test_listener');
|
||||
finalizers.add(() async {
|
||||
printTrace('test $ourTestCount: deleting temporary directory');
|
||||
temporaryDirectory.deleteSync(recursive: true);
|
||||
});
|
||||
|
||||
// Prepare the Dart file that will talk to us and start the test.
|
||||
listenerFile = fs.file(
|
||||
'${temporaryDirectory.path}/listener.dart');
|
||||
listenerFile.createSync();
|
||||
listenerFile.writeAsStringSync(_generateTestMain(
|
||||
testUrl: fs.path.toUri(fs.path.absolute(testPath)).toString(),
|
||||
encodedWebsocketUrl: Uri.encodeComponent(_getWebSocketUrl(server)),
|
||||
));
|
||||
}
|
||||
// Start the engine subprocess.
|
||||
printTrace('test $ourTestCount: starting shell process${previewDart2? " in preview-dart-2 mode":""}');
|
||||
|
||||
String mainDart = listenerFile.path;
|
||||
String mainDart = listenerFile?.path ?? testPath;
|
||||
String bundlePath;
|
||||
|
||||
if (previewDart2) {
|
||||
final Completer<String> completer = new Completer<String>();
|
||||
compilerController.add(new CompilationRequest(listenerFile.path, completer));
|
||||
mainDart = await completer.future;
|
||||
if (dillFilePath == null) {
|
||||
final Completer<String> completer = new Completer<String>();
|
||||
compilerController.add(
|
||||
new CompilationRequest(listenerFile.path, completer));
|
||||
mainDart = await completer.future;
|
||||
|
||||
if (mainDart == null) {
|
||||
controller.sink.addError(_getErrorMessage('Compilation failed', testPath, shellPath));
|
||||
return null;
|
||||
if (mainDart == null) {
|
||||
controller.sink.addError(
|
||||
_getErrorMessage('Compilation failed', testPath, shellPath));
|
||||
return null;
|
||||
}
|
||||
|
||||
// bundlePath needs to point to a folder with `platform.dill` file.
|
||||
final Directory tempBundleDirectory = fs.systemTempDirectory
|
||||
.createTempSync('flutter_bundle_directory');
|
||||
finalizers.add(() async {
|
||||
printTrace(
|
||||
'test $ourTestCount: deleting temporary bundle directory');
|
||||
tempBundleDirectory.deleteSync(recursive: true);
|
||||
});
|
||||
|
||||
// copy 'vm_platform_strong.dill' into 'platform.dill'
|
||||
final File vmPlatformStrongDill = fs.file(
|
||||
artifacts.getArtifactPath(Artifact.platformKernelDill),
|
||||
);
|
||||
final File platformDill = vmPlatformStrongDill.copySync(
|
||||
tempBundleDirectory
|
||||
.childFile('platform.dill')
|
||||
.path,
|
||||
);
|
||||
if (!platformDill.existsSync()) {
|
||||
printError('unexpected error copying platform kernel file');
|
||||
}
|
||||
|
||||
bundlePath = tempBundleDirectory.path;
|
||||
} else {
|
||||
mainDart = dillFilePath;
|
||||
bundlePath = artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath);
|
||||
}
|
||||
|
||||
// bundlePath needs to point to a folder with `platform.dill` file.
|
||||
final Directory tempBundleDirectory = fs.systemTempDirectory
|
||||
.createTempSync('flutter_bundle_directory');
|
||||
finalizers.add(() async {
|
||||
printTrace('test $ourTestCount: deleting temporary bundle directory');
|
||||
tempBundleDirectory.deleteSync(recursive: true);
|
||||
});
|
||||
|
||||
// copy 'vm_platform_strong.dill' into 'platform.dill'
|
||||
final File vmPlatformStrongDill = fs.file(
|
||||
artifacts.getArtifactPath(Artifact.platformKernelDill),
|
||||
);
|
||||
final File platformDill = vmPlatformStrongDill.copySync(
|
||||
tempBundleDirectory.childFile('platform.dill').path,
|
||||
);
|
||||
if (!platformDill.existsSync()) {
|
||||
printError('unexpected error copying platform kernel file');
|
||||
}
|
||||
|
||||
bundlePath = tempBundleDirectory.path;
|
||||
}
|
||||
|
||||
final Process process = await _startProcess(
|
||||
|
Loading…
Reference in New Issue
Block a user