run_mojo.dart 5.22 KB
Newer Older
1 2 3 4 5 6 7 8 9
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';
import 'dart:io';

import 'package:path/path.dart' as path;

10
import '../base/process.dart';
11
import '../build_info.dart';
12
import '../cache.dart';
13
import '../flx.dart' as flx;
14
import '../globals.dart';
15
import '../resident_runner.dart';
16
import '../runner/flutter_command.dart';
17 18

const String _kDefaultBundlePath = 'build/app.flx';
19

20
class RunMojoCommand extends FlutterCommand {
21
  RunMojoCommand({ this.hidden: false }) {
22
    argParser.addFlag('android', negatable: false, help: 'Run on an Android device');
23
    argParser.addFlag('checked', negatable: false, help: 'Run Flutter in checked mode');
24 25 26
    argParser.addFlag('mojo-debug', negatable: false, help: 'Use Debug build of mojo');
    argParser.addFlag('mojo-release', negatable: false, help: 'Use Release build of mojo (default)');

27 28 29 30 31
    argParser.addOption('target',
        defaultsTo: '',
        abbr: 't',
        help: 'Target app path or filename to start.');
    argParser.addOption('app', help: 'Run this Flutter app instead of building the target.');
32 33
    argParser.addOption('mojo-path', help: 'Path to directory containing mojo_shell and services.');
    argParser.addOption('devtools-path', help: 'Path to mojo devtools\' mojo_run command.');
34 35
  }

36 37 38 39 40 41 42 43 44
  @override
  final String name = 'run_mojo';

  @override
  final String description = 'Run a Flutter app in mojo (from github.com/domokit/mojo).';

  @override
  final bool hidden;

45
  @override
Kris Giesing's avatar
Kris Giesing committed
46
  bool get requiresProjectRoot => false;
47

48
  // TODO(abarth): Why not use path.absolute?
49
  String _makePathAbsolute(String relativePath) {
50
    File file = new File(relativePath);
51
    if (!file.existsSync()) {
Hixie's avatar
Hixie committed
52
      throw new Exception('Path "$relativePath" does not exist');
53 54 55 56
    }
    return file.absolute.path;
  }

57 58 59 60 61 62 63 64 65 66
  bool _useDevtools() {
    if (argResults['android'] || argResults['devtools-path'] != null) {
      return true;
    }
    return false;
  }

  String _getDevtoolsPath() {
    if (argResults['devtools-path'] != null) {
      return _makePathAbsolute(argResults['devtools-path']);
67
    }
68 69 70 71
    return _makePathAbsolute(path.join(argResults['mojo-path'], 'mojo', 'devtools', 'common', 'mojo_run'));
  }

  String _getMojoShellPath() {
Ian Hickson's avatar
Ian Hickson committed
72
    final String mojoBuildType = argResults['mojo-debug']  ? 'Debug' : 'Release';
73
    return _makePathAbsolute(path.join(argResults['mojo-path'], 'out', mojoBuildType, 'mojo_shell'));
74 75
  }

76
  Future<List<String>> _getShellConfig(String targetApp) async {
77
    List<String> args = <String>[];
78

79 80
    final bool useDevtools = _useDevtools();
    final String command = useDevtools ? _getDevtoolsPath() : _getMojoShellPath();
81 82
    args.add(command);

83 84
    TargetPlatform targetPlatform = argResults['android'] ? TargetPlatform.android_arm : TargetPlatform.linux_x64;
    String flutterPath = path.join(tools.getEngineArtifactsDirectory(targetPlatform, BuildMode.debug).path, 'flutter.mojo');
85

86
    if (argResults['android'])
87
      args.add('--android');
88

89
    final Uri appUri = Uri.parse(targetApp);
90
    if (appUri.scheme.isEmpty || appUri.scheme == 'file') {
91
      final String appPath = _makePathAbsolute(targetApp);
92
      if (argResults['android']) {
93 94 95 96
        final String appName = path.basename(appPath);
        final String appDir = path.dirname(appPath);
        args.add('mojo:launcher http://app/$appName');
        args.add('--map-origin=http://app/=$appDir');
97 98 99
      } else {
        args.add('mojo:launcher file://$appPath');
      }
100
    } else {
101
      args.add('mojo:launcher $targetApp');
102 103 104 105
    }

    // Add url-mapping for mojo:flutter.
    if (argResults['android']) {
106 107 108 109
      final String flutterName = path.basename(flutterPath);
      final String flutterDir = path.dirname(flutterPath);
      args.add('--map-origin=http://flutter/=$flutterDir');
      args.add('--url-mappings=mojo:flutter=http://flutter/$flutterName');
110
    } else {
111
      args.add('--url-mappings=mojo:flutter=file://$flutterPath');
112 113 114
    }

    if (useDevtools) {
115
      final String buildFlag = argResults['mojo-debug'] ? '--debug' : '--release';
116
      args.add(buildFlag);
Devon Carew's avatar
Devon Carew committed
117
      if (logger.isVerbose)
118 119 120
        args.add('--verbose');
    }

121
    if (argResults['checked'])
122
      args.add('--args-for=mojo:flutter --enable-checked-mode');
123 124

    args.addAll(argResults.rest);
125
    printStatus('$args');
126
    return args;
127 128
  }

129
  @override
Kris Giesing's avatar
Kris Giesing committed
130
  Future<int> runInProject() async {
131
    if ((argResults['mojo-path'] == null && argResults['devtools-path'] == null) || (argResults['mojo-path'] != null && argResults['devtools-path'] != null)) {
132
      printError('Must specify either --mojo-path or --devtools-path.');
133 134 135
      return 1;
    }

136
    if (argResults['mojo-debug'] && argResults['mojo-release']) {
137
      printError('Cannot specify both --mojo-debug and --mojo-release');
138 139
      return 1;
    }
140

141 142 143
    String targetApp = argResults['app'];
    if (targetApp == null) {
      targetApp = _kDefaultBundlePath;
144

145
      String mainPath = findMainDartFile(argResults['target']);
Kris Giesing's avatar
Kris Giesing committed
146

147 148
      int result = await flx.build(
        mainPath: mainPath,
149
        outputPath: targetApp
150
      );
151 152 153 154
      if (result != 0)
        return result;
    }

155 156
    Cache.releaseLockEarly();

157
    return await runCommandAndStreamOutput(await _getShellConfig(targetApp));
158
  }
159
}