context_runner.dart 13.5 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4 5 6
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';

7
import 'package:process/process.dart';
8
import 'package:unified_analytics/unified_analytics.dart';
9

10
import 'android/android_builder.dart';
11 12 13
import 'android/android_sdk.dart';
import 'android/android_studio.dart';
import 'android/android_workflow.dart';
14
import 'android/gradle.dart';
15
import 'android/gradle_utils.dart';
16
import 'android/java.dart';
17
import 'application_package.dart';
18 19
import 'artifacts.dart';
import 'asset.dart';
20 21
import 'base/config.dart';
import 'base/context.dart';
22
import 'base/error_handling_io.dart';
23 24 25
import 'base/io.dart';
import 'base/logger.dart';
import 'base/os.dart';
26
import 'base/process.dart';
27
import 'base/terminal.dart';
28
import 'base/time.dart';
29
import 'base/user_messages.dart';
30
import 'build_system/build_system.dart';
31
import 'cache.dart';
32
import 'custom_devices/custom_devices_config.dart';
33
import 'dart/pub.dart';
34 35
import 'devfs.dart';
import 'device.dart';
36
import 'devtools_launcher.dart';
37
import 'doctor.dart';
38
import 'emulator.dart';
39
import 'features.dart';
40
import 'flutter_application_package.dart';
41
import 'flutter_cache.dart';
42
import 'flutter_device_manager.dart';
43
import 'flutter_features.dart';
44
import 'fuchsia/fuchsia_device.dart' show FuchsiaDeviceTools;
45
import 'fuchsia/fuchsia_sdk.dart' show FuchsiaArtifacts, FuchsiaSdk;
46
import 'fuchsia/fuchsia_workflow.dart' show FuchsiaWorkflow, fuchsiaWorkflow;
47
import 'globals.dart' as globals;
48
import 'ios/ios_workflow.dart';
49
import 'ios/iproxy.dart';
50 51
import 'ios/simulators.dart';
import 'ios/xcodeproj.dart';
52 53
import 'macos/cocoapods.dart';
import 'macos/cocoapods_validator.dart';
54
import 'macos/macos_workflow.dart';
55
import 'macos/xcdevice.dart';
56
import 'macos/xcode.dart';
57
import 'mdns_discovery.dart';
58
import 'persistent_tool_state.dart';
59
import 'reporting/crash_reporting.dart';
60
import 'reporting/first_run.dart';
61
import 'reporting/reporting.dart';
62
import 'reporting/unified_analytics.dart';
63
import 'resident_runner.dart';
64
import 'run_hot.dart';
65
import 'runner/local_engine.dart';
66
import 'version.dart';
67
import 'web/workflow.dart';
68 69
import 'windows/visual_studio.dart';
import 'windows/visual_studio_validator.dart';
70
import 'windows/windows_workflow.dart';
71

72
Future<T> runInContext<T>(
73
  FutureOr<T> Function() runner, {
74
  Map<Type, Generator>? overrides,
75
}) async {
76 77 78

  // Wrap runner with any asynchronous initialization that should run with the
  // overrides and callbacks.
79
  late bool runningOnBot;
80 81 82 83 84
  FutureOr<T> runnerWrapper() async {
    runningOnBot = await globals.isRunningOnBot;
    return runner();
  }

85 86
  // TODO(ianh): We should split this into two, one for tests (which should be
  // in test/), and one for production (which should be in executable.dart).
87
  return context.run<T>(
88
    name: 'global fallbacks',
89
    body: runnerWrapper,
90 91
    overrides: overrides,
    fallbacks: <Type, Generator>{
92 93 94 95
      Analytics: () => getAnalytics(
        runningOnBot: runningOnBot,
        flutterVersion: globals.flutterVersion,
        environment: globals.platform.environment,
96
        clientIde: globals.platform.environment['FLUTTER_HOST'],
97
        config: globals.config,
98
      ),
99
      AndroidBuilder: () => AndroidGradleBuilder(
100
        java: globals.java,
101
        logger: globals.logger,
102 103
        processManager: globals.processManager,
        fileSystem: globals.fs,
104
        artifacts: globals.artifacts!,
105
        usage: globals.flutterUsage,
106
        analytics: globals.analytics,
107
        gradleUtils: globals.gradleUtils!,
108
        platform: globals.platform,
109
        androidStudio: globals.androidStudio,
110
      ),
111 112 113 114
      AndroidLicenseValidator: () => AndroidLicenseValidator(
        platform: globals.platform,
        userMessages: globals.userMessages,
        processManager: globals.processManager,
115
        java: globals.java,
116 117 118 119
        androidSdk: globals.androidSdk,
        logger: globals.logger,
        stdio: globals.stdio,
      ),
120 121
      AndroidSdk: AndroidSdk.locateAndroidSdk,
      AndroidStudio: AndroidStudio.latestValid,
122
      AndroidValidator: () => AndroidValidator(
123
        java: globals.java,
124 125 126 127 128
        androidSdk: globals.androidSdk,
        logger: globals.logger,
        platform: globals.platform,
        userMessages: globals.userMessages,
      ),
129 130
      AndroidWorkflow: () => AndroidWorkflow(
        androidSdk: globals.androidSdk,
131
        featureFlags: featureFlags,
132
      ),
133
      ApplicationPackageFactory: () => FlutterApplicationPackageFactory(
134 135 136 137 138 139
        userMessages: globals.userMessages,
        processManager: globals.processManager,
        logger: globals.logger,
        fileSystem: globals.fs,
        androidSdk: globals.androidSdk,
      ),
140 141 142 143
      Artifacts: () => CachedArtifacts(
        fileSystem: globals.fs,
        cache: globals.cache,
        platform: globals.platform,
144
        operatingSystemUtils: globals.os,
145
      ),
146 147 148 149
      AssetBundleFactory: () {
        return AssetBundleFactory.defaultInstance(
          logger: globals.logger,
          fileSystem: globals.fs,
150
          platform: globals.platform,
151 152
        );
      },
153
      BuildSystem: () => FlutterBuildSystem(
154 155 156 157
        fileSystem: globals.fs,
        logger: globals.logger,
        platform: globals.platform,
      ),
158
      Cache: () => FlutterCache(
159 160 161
        fileSystem: globals.fs,
        logger: globals.logger,
        platform: globals.platform,
162
        osUtils: globals.os,
163
        projectFactory: globals.projectFactory,
164
      ),
165 166 167 168 169
      CocoaPods: () => CocoaPods(
        fileSystem: globals.fs,
        processManager: globals.processManager,
        logger: globals.logger,
        platform: globals.platform,
170
        xcodeProjectInterpreter: globals.xcodeProjectInterpreter!,
171
        usage: globals.flutterUsage,
172
        analytics: globals.analytics,
173
      ),
174
      CocoaPodsValidator: () => CocoaPodsValidator(
175
        globals.cocoaPods!,
176 177
        globals.userMessages,
      ),
178
      Config: () => Config(
179 180
        Config.kFlutterSettings,
        fileSystem: globals.fs,
181
        logger: globals.logger,
182
        platform: globals.platform,
183
      ),
184 185 186 187 188
      CustomDevicesConfig: () => CustomDevicesConfig(
        fileSystem: globals.fs,
        logger: globals.logger,
        platform: globals.platform
      ),
189 190 191 192 193
      CrashReporter: () => CrashReporter(
        fileSystem: globals.fs,
        logger: globals.logger,
        flutterProjectFactory: globals.projectFactory,
      ),
194
      DevFSConfig: () => DevFSConfig(),
195 196 197 198 199
      DeviceManager: () => FlutterDeviceManager(
        logger: globals.logger,
        processManager: globals.processManager,
        platform: globals.platform,
        androidSdk: globals.androidSdk,
200
        iosSimulatorUtils: globals.iosSimulatorUtils!,
201 202
        featureFlags: featureFlags,
        fileSystem: globals.fs,
203 204
        iosWorkflow: globals.iosWorkflow!,
        artifacts: globals.artifacts!,
205
        flutterVersion: globals.flutterVersion,
206 207 208
        androidWorkflow: androidWorkflow!,
        fuchsiaWorkflow: fuchsiaWorkflow!,
        xcDevice: globals.xcdevice!,
209
        userMessages: globals.userMessages,
210
        windowsWorkflow: windowsWorkflow!,
211 212 213 214
        macOSWorkflow: MacOSWorkflow(
          platform: globals.platform,
          featureFlags: featureFlags,
        ),
215
        fuchsiaSdk: globals.fuchsiaSdk!,
216
        operatingSystemUtils: globals.os,
217
        customDevicesConfig: globals.customDevicesConfig,
218
      ),
219 220
      DevtoolsLauncher: () => DevtoolsServerLauncher(
        processManager: globals.processManager,
221
        dartExecutable: globals.artifacts!.getArtifactPath(Artifact.engineDartBinary),
222
        logger: globals.logger,
223
        botDetector: globals.botDetector,
224
      ),
225 226 227 228
      Doctor: () => Doctor(
        logger: globals.logger,
        clock: globals.systemClock,
      ),
229
      DoctorValidatorsProvider: () => DoctorValidatorsProvider.defaultInstance,
230
      EmulatorManager: () => EmulatorManager(
231
        java: globals.java,
232 233 234 235
        androidSdk: globals.androidSdk,
        processManager: globals.processManager,
        logger: globals.logger,
        fileSystem: globals.fs,
236
        androidWorkflow: androidWorkflow!,
237
      ),
238 239 240 241 242
      FeatureFlags: () => FlutterFeatureFlags(
        flutterVersion: globals.flutterVersion,
        config: globals.config,
        platform: globals.platform,
      ),
243 244 245 246
      FlutterVersion: () => FlutterVersion(
        fs: globals.fs,
        flutterRoot: Cache.flutterRoot!,
      ),
247
      FuchsiaArtifacts: () => FuchsiaArtifacts.find(),
248
      FuchsiaDeviceTools: () => FuchsiaDeviceTools(),
249
      FuchsiaSdk: () => FuchsiaSdk(),
250 251 252
      FuchsiaWorkflow: () => FuchsiaWorkflow(
        featureFlags: featureFlags,
        platform: globals.platform,
253
        fuchsiaArtifacts: globals.fuchsiaArtifacts!,
254
      ),
255 256 257 258 259 260
      GradleUtils: () => GradleUtils(
        operatingSystemUtils: globals.os,
        logger: globals.logger,
        platform: globals.platform,
        cache: globals.cache,
      ),
261
      HotRunnerConfig: () => HotRunnerConfig(),
262
      IOSSimulatorUtils: () => IOSSimulatorUtils(
263 264
        logger: globals.logger,
        processManager: globals.processManager,
265
        xcode: globals.xcode!,
266
      ),
267 268
      IOSWorkflow: () => IOSWorkflow(
        featureFlags: featureFlags,
269
        xcode: globals.xcode!,
270 271
        platform: globals.platform,
      ),
272
      Java: () => Java.find(
273
        config: globals.config,
274 275 276 277 278 279
        androidStudio: globals.androidStudio,
        logger: globals.logger,
        fileSystem: globals.fs,
        platform: globals.platform,
        processManager: globals.processManager
      ),
280
      LocalEngineLocator: () => LocalEngineLocator(
281
        userMessages: globals.userMessages,
282 283 284
        logger: globals.logger,
        platform: globals.platform,
        fileSystem: globals.fs,
285
        flutterRoot: Cache.flutterRoot!,
286
      ),
287 288 289 290
      Logger: () => globals.platform.isWindows
        ? WindowsStdoutLogger(
            terminal: globals.terminal,
            stdio: globals.stdio,
291
            outputPreferences: globals.outputPreferences,
292 293 294 295
          )
        : StdoutLogger(
            terminal: globals.terminal,
            stdio: globals.stdio,
296
            outputPreferences: globals.outputPreferences,
297
          ),
298 299 300 301
      MacOSWorkflow: () => MacOSWorkflow(
        featureFlags: featureFlags,
        platform: globals.platform,
      ),
302
      MDnsVmServiceDiscovery: () => MDnsVmServiceDiscovery(
303 304
        logger: globals.logger,
        flutterUsage: globals.flutterUsage,
305
        analytics: globals.analytics,
306
      ),
307 308 309 310 311 312
      OperatingSystemUtils: () => OperatingSystemUtils(
        fileSystem: globals.fs,
        logger: globals.logger,
        platform: globals.platform,
        processManager: globals.processManager,
      ),
313
      OutputPreferences: () => OutputPreferences(
314
        wrapText: globals.stdio.hasTerminal,
315 316 317
        showColor:  globals.platform.stdoutSupportsAnsi,
        stdio: globals.stdio,
      ),
318 319 320 321 322
      PersistentToolState: () => PersistentToolState(
        fileSystem: globals.fs,
        logger: globals.logger,
        platform: globals.platform,
      ),
323
      ProcessInfo: () => ProcessInfo(globals.fs),
324
      ProcessManager: () => ErrorHandlingProcessManager(
325
        delegate: const LocalProcessManager(),
326 327
        platform: globals.platform,
      ),
328 329 330 331
      ProcessUtils: () => ProcessUtils(
        processManager: globals.processManager,
        logger: globals.logger,
      ),
332 333 334 335 336 337 338 339
      Pub: () => Pub(
        fileSystem: globals.fs,
        logger: globals.logger,
        processManager: globals.processManager,
        botDetector: globals.botDetector,
        platform: globals.platform,
        usage: globals.flutterUsage,
      ),
340
      Stdio: () => Stdio(),
341
      SystemClock: () => const SystemClock(),
342 343
      Usage: () => Usage(
        runningOnBot: runningOnBot,
344
        firstRunMessenger: FirstRunMessenger(persistentToolState: globals.persistentToolState!),
345
      ),
346
      UserMessages: () => UserMessages(),
347 348 349 350 351 352 353
      VisualStudioValidator: () => VisualStudioValidator(
        userMessages: globals.userMessages,
        visualStudio: VisualStudio(
          fileSystem: globals.fs,
          platform: globals.platform,
          logger: globals.logger,
          processManager: globals.processManager,
354
          osUtils: globals.os,
355 356
        )
      ),
357 358 359 360
      WebWorkflow: () => WebWorkflow(
        featureFlags: featureFlags,
        platform: globals.platform,
      ),
361 362 363 364
      WindowsWorkflow: () => WindowsWorkflow(
        featureFlags: featureFlags,
        platform: globals.platform,
      ),
365 366 367 368 369
      Xcode: () => Xcode(
        logger: globals.logger,
        processManager: globals.processManager,
        platform: globals.platform,
        fileSystem: globals.fs,
370
        xcodeProjectInterpreter: globals.xcodeProjectInterpreter!,
371
        userMessages: globals.userMessages,
372
      ),
373 374 375
      XCDevice: () => XCDevice(
        processManager: globals.processManager,
        logger: globals.logger,
376
        artifacts: globals.artifacts!,
377 378
        cache: globals.cache,
        platform: globals.platform,
379
        xcode: globals.xcode!,
380
        iproxy: IProxy(
381
          iproxyPath: globals.artifacts!.getHostArtifact(
382 383
            HostArtifact.iproxy,
          ).path,
384 385 386 387
          logger: globals.logger,
          processManager: globals.processManager,
          dyLdLibEntry: globals.cache.dyLdLibEntry,
        ),
388
        fileSystem: globals.fs,
389
        analytics: globals.analytics,
390
      ),
391 392 393 394 395
      XcodeProjectInterpreter: () => XcodeProjectInterpreter(
        logger: globals.logger,
        processManager: globals.processManager,
        platform: globals.platform,
        fileSystem: globals.fs,
396
        usage: globals.flutterUsage,
397
        analytics: globals.analytics,
398
      ),
399 400
    },
  );
401
}