diff --git a/packages/flutter_tools/lib/src/windows/build_windows.dart b/packages/flutter_tools/lib/src/windows/build_windows.dart index c614c64b4e9f6..d82c68345c94b 100644 --- a/packages/flutter_tools/lib/src/windows/build_windows.dart +++ b/packages/flutter_tools/lib/src/windows/build_windows.dart @@ -21,6 +21,7 @@ import '../flutter_plugins.dart'; import '../globals.dart' as globals; import '../migrations/cmake_custom_command_migration.dart'; import '../migrations/cmake_native_assets_migration.dart'; +import '../shorebird/shorebird_yaml.dart'; import 'migrations/build_architecture_migration.dart'; import 'migrations/show_window_migration.dart'; import 'migrations/version_migration.dart'; @@ -127,6 +128,21 @@ Future<void> buildWindows( 'Built ${globals.fs.path.relative(buildOutput.path)}', color: TerminalColor.green, ); + final File shorebirdYamlFile = buildDirectory + .childDirectory('runner') + .childDirectory(sentenceCase(buildModeName)) + .childDirectory('data') + .childDirectory('flutter_assets') + .childFile('shorebird.yaml'); + + if (shorebirdYamlFile.existsSync()) { + try { + updateShorebirdYaml(buildInfo, shorebirdYamlFile.path, environment: globals.platform.environment); + } on Exception catch (error) { + globals.printError('[shorebird] failed to generate shorebird configuration.\n$error'); + throw Exception('Failed to generate shorebird configuration'); + } + } if (buildInfo.codeSizeDirectory != null && sizeAnalyzer != null) { final String arch = getNameForTargetPlatform(targetPlatform); diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart index 8a317a99b2036..5370d475ccdb3 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart @@ -37,6 +37,15 @@ final Platform windowsPlatform = FakePlatform( 'USERPROFILE': '/', } ); +final Platform windowsPlatformWithPublicKey = FakePlatform( + operatingSystem: 'windows', + environment: <String, String>{ + 'PROGRAMFILES(X86)': r'C:\Program Files (x86)\', + 'FLUTTER_ROOT': flutterRoot, + 'USERPROFILE': '/', + 'SHOREBIRD_PUBLIC_KEY': 'my_public_key', + } +); final Platform notWindowsPlatform = FakePlatform( environment: <String, String>{ 'FLUTTER_ROOT': flutterRoot, @@ -1069,6 +1078,39 @@ No file or variants found for asset: images/a_dot_burr.jpeg. Platform: () => windowsPlatform, FeatureFlags: () => TestFeatureFlags(isWindowsEnabled: true), }); + + testUsingContext( + 'shorebird.yaml is updated when SHOREBIRD_PUBLIC_KEY env var is set', + () async { + final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); + final BuildWindowsCommand command = BuildWindowsCommand( + logger: BufferLogger.test(), + operatingSystemUtils: FakeOperatingSystemUtils()) + ..visualStudioOverride = fakeVisualStudio; + setUpMockProjectFilesForBuild(); + final File shorebirdYamlFile = fileSystem.file( + r'build\windows\x64\runner\Release\data\flutter_assets\shorebird.yaml', + ) + ..createSync(recursive: true) + ..writeAsStringSync('app_id: my-app-id'); + + processManager = FakeProcessManager.list(<FakeCommand>[ + cmakeGenerationCommand(), + buildCommand('Release'), + ]); + + await createTestCommandRunner(command) + .run(const <String>['windows', '--release', '--no-pub']); + + final String updatedYaml = shorebirdYamlFile.readAsStringSync(); + expect(updatedYaml, contains('app_id: my-app-id')); + expect(updatedYaml, contains('patch_public_key: my_public_key')); + }, overrides: <Type, Generator>{ + FileSystem: () => fileSystem, + ProcessManager: () => processManager, + Platform: () => windowsPlatformWithPublicKey, + FeatureFlags: () => TestFeatureFlags(isWindowsEnabled: true), + }); } class FakeVisualStudio extends Fake implements VisualStudio {