compile.dart 5.02 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
// @dart = 2.8

7
import '../artifacts.dart';
8 9
import '../base/common.dart';
import '../base/file_system.dart';
10
import '../base/logger.dart';
11
import '../build_info.dart';
12 13
import '../build_system/build_system.dart';
import '../build_system/targets/web.dart';
14
import '../cache.dart';
15
import '../flutter_plugins.dart';
16
import '../globals.dart' as globals;
17 18
import '../platform_plugins.dart';
import '../plugins.dart';
19
import '../project.dart';
20

21 22 23 24
Future<void> buildWeb(
  FlutterProject flutterProject,
  String target,
  BuildInfo buildInfo,
25
  bool csp,
26
  String serviceWorkerStrategy,
27
  bool sourceMaps,
28
  bool nativeNullAssertions,
29
  String baseHref,
30
) async {
31
  final bool hasWebPlugins = (await findPlugins(flutterProject))
32
    .any((Plugin p) => p.platforms.containsKey(WebPlugin.kConfigKey));
33
  final Directory outputDirectory = globals.fs.directory(getWebBuildDirectory());
34 35
  outputDirectory.createSync(recursive: true);

36
  await injectPlugins(flutterProject, webPlatform: true);
37
  final Status status = globals.logger.startProgress('Compiling $target for the Web...');
38
  final Stopwatch sw = Stopwatch()..start();
39
  try {
40
    final BuildResult result = await globals.buildSystem.build(WebServiceWorker(globals.fs, globals.cache), Environment(
41
      projectDir: globals.fs.currentDirectory,
42
      outputDir: outputDirectory,
43 44 45 46 47 48
      buildDir: flutterProject.directory
        .childDirectory('.dart_tool')
        .childDirectory('flutter_build'),
      defines: <String, String>{
        kTargetFile: target,
        kHasWebPlugins: hasWebPlugins.toString(),
49
        kCspMode: csp.toString(),
50
        kBaseHref : baseHref,
51
        kSourceMapsEnabled: sourceMaps.toString(),
52
        kNativeNullAssertions: nativeNullAssertions.toString(),
53 54
        if (serviceWorkerStrategy != null)
         kServiceWorkerStrategy: serviceWorkerStrategy,
55
        ...buildInfo.toBuildSystemEnvironment(),
56
      },
57 58 59 60
      artifacts: globals.artifacts,
      fileSystem: globals.fs,
      logger: globals.logger,
      processManager: globals.processManager,
61
      platform: globals.platform,
62 63 64 65 66
      cacheDir: globals.cache.getRoot(),
      engineVersion: globals.artifacts.isLocalEngine
        ? null
        : globals.flutterVersion.engineRevision,
      flutterRootDir: globals.fs.directory(Cache.flutterRoot),
67 68 69
      // Web uses a different Dart plugin registry.
      // https://github.com/flutter/flutter/issues/80406
      generateDartPluginRegistry: false,
70 71
    ));
    if (!result.success) {
72
      for (final ExceptionMeasurement measurement in result.exceptions.values) {
73
        globals.printError('Target ${measurement.target} failed: ${measurement.exception}',
74 75 76 77
          stackTrace: measurement.fatal
            ? measurement.stackTrace
            : null,
        );
78 79
      }
      throwToolExit('Failed to compile application for the Web.');
80
    }
81
  } on Exception catch (err) {
82 83 84
    throwToolExit(err.toString());
  } finally {
    status.stop();
85
  }
86
  globals.flutterUsage.sendTiming('build', 'dart2js', Duration(milliseconds: sw.elapsedMilliseconds));
87
}
88

89 90 91 92 93 94 95 96 97 98 99
/// Web rendering backend mode.
enum WebRendererMode {
  /// Auto detects which rendering backend to use.
  autoDetect,
  /// Always uses canvaskit.
  canvaskit,
  /// Always uses html.
  html,
}

/// The correct precompiled artifact to use for each build and render mode.
100 101 102 103
const Map<WebRendererMode, Map<NullSafetyMode, HostArtifact>> kDartSdkJsArtifactMap = <WebRendererMode, Map<NullSafetyMode, HostArtifact>>{
  WebRendererMode.autoDetect: <NullSafetyMode, HostArtifact> {
    NullSafetyMode.sound: HostArtifact.webPrecompiledCanvaskitAndHtmlSoundSdk,
    NullSafetyMode.unsound: HostArtifact.webPrecompiledCanvaskitAndHtmlSdk,
104
  },
105 106 107
  WebRendererMode.canvaskit: <NullSafetyMode, HostArtifact> {
    NullSafetyMode.sound: HostArtifact.webPrecompiledCanvaskitSoundSdk,
    NullSafetyMode.unsound: HostArtifact.webPrecompiledCanvaskitSdk,
108
  },
109 110 111
  WebRendererMode.html: <NullSafetyMode, HostArtifact> {
    NullSafetyMode.sound: HostArtifact.webPrecompiledSoundSdk,
    NullSafetyMode.unsound: HostArtifact.webPrecompiledSdk,
112 113 114 115
  },
};

/// The correct source map artifact to use for each build and render mode.
116 117 118 119
const Map<WebRendererMode, Map<NullSafetyMode, HostArtifact>> kDartSdkJsMapArtifactMap = <WebRendererMode, Map<NullSafetyMode, HostArtifact>>{
  WebRendererMode.autoDetect: <NullSafetyMode, HostArtifact> {
    NullSafetyMode.sound: HostArtifact.webPrecompiledCanvaskitAndHtmlSoundSdkSourcemaps,
    NullSafetyMode.unsound: HostArtifact.webPrecompiledCanvaskitAndHtmlSdkSourcemaps,
120
  },
121 122 123
  WebRendererMode.canvaskit: <NullSafetyMode, HostArtifact> {
    NullSafetyMode.sound: HostArtifact.webPrecompiledCanvaskitSoundSdkSourcemaps,
    NullSafetyMode.unsound: HostArtifact.webPrecompiledCanvaskitSdkSourcemaps,
124
  },
125 126 127
  WebRendererMode.html: <NullSafetyMode, HostArtifact> {
    NullSafetyMode.sound: HostArtifact.webPrecompiledSoundSdkSourcemaps,
    NullSafetyMode.unsound: HostArtifact.webPrecompiledSdkSourcemaps,
128 129
  },
};