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

5

6

7 8
import 'dart:async';

9 10
import 'package:process/process.dart';

11
import 'android/android_builder.dart';
12 13 14
import 'android/android_sdk.dart';
import 'android/android_studio.dart';
import 'android/android_workflow.dart';
15
import 'android/gradle.dart';
16
import 'android/gradle_utils.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 'resident_runner.dart';
63
import 'run_hot.dart';
64
import 'runner/local_engine.dart';
65
import 'version.dart';
66
import 'web/workflow.dart';
67 68
import 'windows/visual_studio.dart';
import 'windows/visual_studio_validator.dart';
69
import 'windows/windows_workflow.dart';
70

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

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

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