diff --git a/packages/flutter_tools/lib/src/build_system/targets/web.dart b/packages/flutter_tools/lib/src/build_system/targets/web.dart index d097dcbd817..ef5a7c89ca6 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/web.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/web.dart @@ -55,12 +55,16 @@ class WebEntrypointTarget extends Target { String contents; if (hasPlugins) { + final String generatedPath = environment.projectDir + .childDirectory('lib') + .childFile('generated_plugin_registrant.dart') + .absolute.uri.toString(); contents = ''' import 'dart:ui' as ui; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; -import 'generated_plugin_registrant.dart'; +import '$generatedPath'; import "$import" as entrypoint; Future main() async { diff --git a/packages/flutter_tools/lib/src/web/compile.dart b/packages/flutter_tools/lib/src/web/compile.dart index c924c3e547a..7644f63eb94 100644 --- a/packages/flutter_tools/lib/src/web/compile.dart +++ b/packages/flutter_tools/lib/src/web/compile.dart @@ -27,9 +27,10 @@ Future buildWeb(FlutterProject flutterProject, String target, BuildInfo bu } final bool hasWebPlugins = findPlugins(flutterProject) .any((Plugin p) => p.platforms.containsKey(WebPlugin.kConfigKey)); + await injectPlugins(flutterProject, checkProjects: true); final Status status = logger.startProgress('Compiling $target for the Web...', timeout: null); final Stopwatch sw = Stopwatch()..start(); - final BuildResult result = await const BuildSystem().build(const WebReleaseBundle(), Environment( + final BuildResult result = await buildSystem.build(const WebReleaseBundle(), Environment( outputDir: fs.directory(getWebBuildDirectory()), projectDir: fs.currentDirectory, buildDir: flutterProject.directory diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart index 555b4d2e2ee..72c8e574e83 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart @@ -7,6 +7,7 @@ import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/build_info.dart'; +import 'package:flutter_tools/src/build_system/build_system.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/build.dart'; import 'package:flutter_tools/src/commands/build_web.dart'; @@ -86,6 +87,70 @@ void main() { FeatureFlags: () => TestFeatureFlags(isWebEnabled: false), })); + test('Builds a web bundle - end to end', () => testbed.run(() async { + final CommandRunner runner = createTestCommandRunner(BuildCommand()); + final List dependencies = [ + fs.path.join('packages', 'flutter_tools', 'lib', 'src', 'build_system', 'targets', 'web.dart'), + fs.path.join('bin', 'cache', 'flutter_web_sdk'), + fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'), + fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'), + fs.path.join('bin', 'cache', 'dart-sdk '), + ]; + for (String dependency in dependencies) { + fs.file(dependency).createSync(recursive: true); + } + + // Project files. + fs.file('.packages') + ..writeAsStringSync(''' +foo:lib/ +fizz:bar/lib/ +'''); + fs.file('pubspec.yaml') + ..writeAsStringSync(''' +name: foo + +dependencies: + flutter: + sdk: flutter + fizz: + path: + bar/ +'''); + fs.file(fs.path.join('bar', 'pubspec.yaml')) + ..createSync(recursive: true) + ..writeAsStringSync(''' +name: bar + +flutter: + plugin: + platforms: + web: + pluginClass: UrlLauncherPlugin + fileName: url_launcher_web.dart +'''); + fs.file(fs.path.join('bar', 'lib', 'url_launcher_web.dart')) + ..createSync(recursive: true) + ..writeAsStringSync(''' +class UrlLauncherPlugin {} +'''); + fs.file(fs.path.join('lib', 'main.dart')) + ..writeAsStringSync('void main() { }'); + + // Process calls. We're not testing that these invocations are correct because + // that is covered in targets/web_test.dart. + when(buildSystem.build(any, any)).thenAnswer((Invocation invocation) async { + return BuildResult(success: true); + }); + + await runner.run(['build', 'web']); + + expect(fs.file(fs.path.join('lib', 'generated_plugin_registrant.dart')).existsSync(), true); + }, overrides: { + FeatureFlags: () => TestFeatureFlags(isWebEnabled: true), + BuildSystem: () => MockBuildSystem(), + })); + test('hidden if feature flag is not enabled', () => testbed.run(() async { expect(BuildWebCommand().hidden, true); }, overrides: { @@ -99,6 +164,7 @@ void main() { })); } +class MockBuildSystem extends Mock implements BuildSystem {} class MockWebCompilationProxy extends Mock implements WebCompilationProxy {} class MockPlatform extends Mock implements Platform { @override diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart index 0af986ab1e4..dac418deff9 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart @@ -56,7 +56,7 @@ void main() { final String generated = environment.buildDir.childFile('main.dart').readAsStringSync(); // Plugins - expect(generated, contains("import 'generated_plugin_registrant.dart';")); + expect(generated, contains("import 'file:///lib/generated_plugin_registrant.dart';")); expect(generated, contains('registerPlugins(webPluginRegistry);')); // Platform @@ -77,7 +77,7 @@ void main() { final String generated = environment.buildDir.childFile('main.dart').readAsStringSync(); // Plugins - expect(generated, contains("import 'generated_plugin_registrant.dart';")); + expect(generated, contains("import 'file:///C:/lib/generated_plugin_registrant.dart';")); expect(generated, contains('registerPlugins(webPluginRegistry);')); // Platform @@ -100,7 +100,7 @@ void main() { final String generated = environment.buildDir.childFile('main.dart').readAsStringSync(); // Plugins - expect(generated, isNot(contains("import 'generated_plugin_registrant.dart';"))); + expect(generated, isNot(contains("import 'file:///lib/generated_plugin_registrant.dart';"))); expect(generated, isNot(contains('registerPlugins(webPluginRegistry);'))); // Platform @@ -118,7 +118,7 @@ void main() { final String generated = environment.buildDir.childFile('main.dart').readAsStringSync(); // Plugins - expect(generated, contains("import 'generated_plugin_registrant.dart';")); + expect(generated, contains("import 'file:///lib/generated_plugin_registrant.dart';")); expect(generated, contains('registerPlugins(webPluginRegistry);')); // Platform @@ -136,7 +136,7 @@ void main() { final String generated = environment.buildDir.childFile('main.dart').readAsStringSync(); // Plugins - expect(generated, isNot(contains("import 'generated_plugin_registrant.dart';"))); + expect(generated, isNot(contains("import 'file:///lib/generated_plugin_registrant.dart';"))); expect(generated, isNot(contains('registerPlugins(webPluginRegistry);'))); // Platform