blob: 8f024d240e9f9c133983e1c85bf6bb6582deea23 [file] [log] [blame]
Ian Hickson449f4a62019-11-27 15:04:02 -08001// Copyright 2014 The Flutter Authors. All rights reserved.
Jonah Williams9bc56562019-02-14 22:42:30 -08002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5import 'package:meta/meta.dart';
6
Jonah Williams9bc56562019-02-14 22:42:30 -08007import '../base/common.dart';
8import '../base/context.dart';
9import '../base/file_system.dart';
Jonah Williamsc91b6572019-06-06 21:05:55 -070010import '../base/logger.dart';
Jonah Williams9bc56562019-02-14 22:42:30 -080011import '../build_info.dart';
Jonah Williamsb2f38392019-10-01 14:03:42 -070012import '../build_system/build_system.dart';
13import '../build_system/targets/dart.dart';
14import '../build_system/targets/web.dart';
Yegore7073f92019-11-09 17:08:53 -080015import '../convert.dart';
Jonah Williamsee7a37f2020-01-06 11:04:20 -080016import '../globals.dart' as globals;
Jonah Williamsb2f38392019-10-01 14:03:42 -070017import '../platform_plugins.dart';
18import '../plugins.dart';
Jonah Williamsc91b6572019-06-06 21:05:55 -070019import '../project.dart';
Zachary Andersonef146f62019-07-29 07:24:02 -070020import '../reporting/reporting.dart';
Jonah Williams9bc56562019-02-14 22:42:30 -080021
Jonah Williamsda600ba2019-05-29 22:46:28 -070022/// The [WebCompilationProxy] instance.
Jonah Williamsc91b6572019-06-06 21:05:55 -070023WebCompilationProxy get webCompilationProxy => context.get<WebCompilationProxy>();
Jonah Williamsda600ba2019-05-29 22:46:28 -070024
Yegore7073f92019-11-09 17:08:53 -080025Future<void> buildWeb(
26 FlutterProject flutterProject,
27 String target,
28 BuildInfo buildInfo,
29 bool initializePlatform,
30 List<String> dartDefines,
31) async {
Jonah Williamsf530b802019-06-10 15:37:23 -070032 if (!flutterProject.web.existsSync()) {
33 throwToolExit('Missing index.html.');
34 }
Jonah Williamsb2f38392019-10-01 14:03:42 -070035 final bool hasWebPlugins = findPlugins(flutterProject)
36 .any((Plugin p) => p.platforms.containsKey(WebPlugin.kConfigKey));
Jonah Williamsae18f072019-10-04 00:36:09 -070037 await injectPlugins(flutterProject, checkProjects: true);
Jonah Williamsee7a37f2020-01-06 11:04:20 -080038 final Status status = globals.logger.startProgress('Compiling $target for the Web...', timeout: null);
Zachary Andersonb847ba52019-06-07 13:50:45 -070039 final Stopwatch sw = Stopwatch()..start();
Jonah Williams27105cb2019-10-21 16:46:44 -070040 try {
41 final BuildResult result = await buildSystem.build(const WebReleaseBundle(), Environment(
Jonah Williamsee7a37f2020-01-06 11:04:20 -080042 outputDir: globals.fs.directory(getWebBuildDirectory()),
43 projectDir: globals.fs.currentDirectory,
Jonah Williams27105cb2019-10-21 16:46:44 -070044 buildDir: flutterProject.directory
45 .childDirectory('.dart_tool')
46 .childDirectory('flutter_build'),
47 defines: <String, String>{
48 kBuildMode: getNameForBuildMode(buildInfo.mode),
49 kTargetFile: target,
50 kInitializePlatform: initializePlatform.toString(),
51 kHasWebPlugins: hasWebPlugins.toString(),
Yegore7073f92019-11-09 17:08:53 -080052 kDartDefines: jsonEncode(dartDefines),
Jonah Williams27105cb2019-10-21 16:46:44 -070053 },
54 ));
55 if (!result.success) {
56 for (ExceptionMeasurement measurement in result.exceptions.values) {
Jonah Williamsee7a37f2020-01-06 11:04:20 -080057 globals.printError('Target ${measurement.target} failed: ${measurement.exception}',
Jonah Williamsa7367b62019-11-18 14:04:11 -080058 stackTrace: measurement.fatal
59 ? measurement.stackTrace
60 : null,
61 );
Jonah Williams27105cb2019-10-21 16:46:44 -070062 }
63 throwToolExit('Failed to compile application for the Web.');
Jonah Williams9bc56562019-02-14 22:42:30 -080064 }
Jonah Williams27105cb2019-10-21 16:46:44 -070065 } catch (err) {
66 throwToolExit(err.toString());
67 } finally {
68 status.stop();
Jonah Williamsc91b6572019-06-06 21:05:55 -070069 }
Jonah Williamsb2f38392019-10-01 14:03:42 -070070 flutterUsage.sendTiming('build', 'dart2js', Duration(milliseconds: sw.elapsedMilliseconds));
Jonah Williams9bc56562019-02-14 22:42:30 -080071}
Jonah Williamsda600ba2019-05-29 22:46:28 -070072
73/// An indirection on web compilation.
74///
75/// Avoids issues with syncing build_runner_core to other repos.
76class WebCompilationProxy {
77 const WebCompilationProxy();
78
Jonah Williamsc91b6572019-06-06 21:05:55 -070079 /// Initialize the web compiler from the `projectDirectory`.
80 ///
81 /// Returns whether or not the build was successful.
82 ///
83 /// `release` controls whether we build the bundle for dartdevc or only
Greg Spencera60bf8e2019-11-22 08:43:55 -080084 /// the entry points for dart2js to later take over.
Jonah Williamsc91b6572019-06-06 21:05:55 -070085 Future<bool> initialize({
Jonah Williamsda600ba2019-05-29 22:46:28 -070086 @required Directory projectDirectory,
Jonah Williams477ae6b2019-09-09 18:16:03 -070087 @required String projectName,
Jonah Williamsb3382b92019-06-05 15:27:49 -070088 String testOutputDir,
Yegor903ebd72019-10-24 21:35:14 -070089 List<String> testFiles,
Jonah Williamsf3624192019-08-28 14:05:01 -070090 BuildMode mode,
Jonah Williams69a29642019-09-13 10:20:30 -070091 bool initializePlatform,
Jonah Williamsda600ba2019-05-29 22:46:28 -070092 }) async {
93 throw UnimplementedError();
94 }
Jonah Williamsda600ba2019-05-29 22:46:28 -070095}