From f47295ea95a6b065f94fd4c0bb30d981c34e2801 Mon Sep 17 00:00:00 2001 From: Eric Seidel Date: Fri, 20 Mar 2026 16:46:13 -0700 Subject: [PATCH] refactor: centralize Flutter version constraints into a single file (#3654) --- .../release/ios_framework_releaser.dart | 2 +- .../src/commands/release/ios_releaser.dart | 1 + .../lib/src/commands/release/releaser.dart | 10 +++--- .../lib/src/flutter_version_constraints.dart | 31 +++++++++++++++++++ .../lib/src/platform/apple/apple.dart | 7 ----- .../lib/src/platform/linux/linux.dart | 4 --- .../lib/src/platform/platform.dart | 2 ++ .../lib/src/platform/windows/windows.dart | 4 --- .../test/src/platform/linux/linux_test.dart | 1 + 9 files changed, 40 insertions(+), 22 deletions(-) create mode 100644 packages/shorebird_cli/lib/src/flutter_version_constraints.dart diff --git a/packages/shorebird_cli/lib/src/commands/release/ios_framework_releaser.dart b/packages/shorebird_cli/lib/src/commands/release/ios_framework_releaser.dart index 540405e6..b6d89b01 100644 --- a/packages/shorebird_cli/lib/src/commands/release/ios_framework_releaser.dart +++ b/packages/shorebird_cli/lib/src/commands/release/ios_framework_releaser.dart @@ -11,9 +11,9 @@ import 'package:shorebird_cli/src/commands/release/releaser.dart'; import 'package:shorebird_cli/src/doctor.dart'; import 'package:shorebird_cli/src/executables/xcodebuild.dart'; import 'package:shorebird_cli/src/extensions/arg_results.dart'; +import 'package:shorebird_cli/src/flutter_version_constraints.dart'; import 'package:shorebird_cli/src/logging/logging.dart'; import 'package:shorebird_cli/src/metadata/metadata.dart'; -import 'package:shorebird_cli/src/platform/apple/apple.dart'; import 'package:shorebird_cli/src/release_type.dart'; import 'package:shorebird_cli/src/shorebird_env.dart'; import 'package:shorebird_cli/src/shorebird_validator.dart'; diff --git a/packages/shorebird_cli/lib/src/commands/release/ios_releaser.dart b/packages/shorebird_cli/lib/src/commands/release/ios_releaser.dart index ccaf9cda..948e6271 100644 --- a/packages/shorebird_cli/lib/src/commands/release/ios_releaser.dart +++ b/packages/shorebird_cli/lib/src/commands/release/ios_releaser.dart @@ -11,6 +11,7 @@ import 'package:shorebird_cli/src/commands/release/releaser.dart'; import 'package:shorebird_cli/src/doctor.dart'; import 'package:shorebird_cli/src/executables/xcodebuild.dart'; import 'package:shorebird_cli/src/extensions/arg_results.dart'; +import 'package:shorebird_cli/src/flutter_version_constraints.dart'; import 'package:shorebird_cli/src/logging/logging.dart'; import 'package:shorebird_cli/src/metadata/metadata.dart'; import 'package:shorebird_cli/src/platform/apple/apple.dart'; diff --git a/packages/shorebird_cli/lib/src/commands/release/releaser.dart b/packages/shorebird_cli/lib/src/commands/release/releaser.dart index d48eae2b..7522237e 100644 --- a/packages/shorebird_cli/lib/src/commands/release/releaser.dart +++ b/packages/shorebird_cli/lib/src/commands/release/releaser.dart @@ -7,6 +7,7 @@ import 'package:pub_semver/pub_semver.dart'; import 'package:shorebird_cli/src/artifact_manager.dart'; import 'package:shorebird_cli/src/code_push_client_wrapper.dart'; import 'package:shorebird_cli/src/extensions/arg_results.dart'; +import 'package:shorebird_cli/src/flutter_version_constraints.dart'; import 'package:shorebird_cli/src/logging/logging.dart'; import 'package:shorebird_cli/src/metadata/metadata.dart'; import 'package:shorebird_cli/src/release_type.dart'; @@ -18,9 +19,6 @@ import 'package:shorebird_code_push_protocol/shorebird_code_push_protocol.dart'; export 'package:pub_semver/pub_semver.dart'; -/// Minimum Flutter version for obfuscation support across all platforms. -final _minimumObfuscationFlutterVersion = Version(3, 41, 2); - /// {@template releaser} /// Executes platform-specific functionality to create a release. /// {@endtemplate} @@ -212,10 +210,10 @@ abstract class Releaser { shorebirdEnv.flutterRevision, ); if (flutterVersion != null && - flutterVersion < _minimumObfuscationFlutterVersion) { + flutterVersion < minimumObfuscationFlutterVersion) { logger.err( - 'Obfuscation on ${releaseType.releasePlatform.displayName} requires Flutter ' - '$_minimumObfuscationFlutterVersion or later ' + 'Obfuscation on ${releaseType.releasePlatform.displayName} ' + 'requires Flutter $minimumObfuscationFlutterVersion or later ' '(current: $flutterVersion).', ); throw ProcessExit(ExitCode.unavailable.code); diff --git a/packages/shorebird_cli/lib/src/flutter_version_constraints.dart b/packages/shorebird_cli/lib/src/flutter_version_constraints.dart new file mode 100644 index 00000000..d7aa3bbe --- /dev/null +++ b/packages/shorebird_cli/lib/src/flutter_version_constraints.dart @@ -0,0 +1,31 @@ +import 'package:pub_semver/pub_semver.dart'; + +/// The minimum allowed Flutter version for creating iOS releases. +/// +/// This constraint exists because iOS code push support requires specific +/// Flutter engine changes that were first available in this version. +final minimumSupportedIosFlutterVersion = Version(3, 22, 2); + +/// The minimum allowed Flutter version for creating macOS releases. +/// +/// macOS code push support was introduced later than iOS and requires +/// Flutter engine changes that were first available in this version. +final minimumSupportedMacosFlutterVersion = Version(3, 27, 4); + +/// The minimum allowed Flutter version for creating Linux releases. +/// +/// Linux code push support requires Flutter engine changes that were first +/// available in this version. +final minimumSupportedLinuxFlutterVersion = Version(3, 27, 4); + +/// The minimum allowed Flutter version for creating Windows releases. +/// +/// Windows code push support requires Flutter engine changes that were first +/// available in this version. +final minimumSupportedWindowsFlutterVersion = Version(3, 32, 6); + +/// Minimum Flutter version for obfuscation support across all platforms. +/// +/// Obfuscation requires gen_snapshot changes (--save-obfuscation-map and +/// --strip flags) that were first available in this Flutter version. +final minimumObfuscationFlutterVersion = Version(3, 41, 2); diff --git a/packages/shorebird_cli/lib/src/platform/apple/apple.dart b/packages/shorebird_cli/lib/src/platform/apple/apple.dart index 1e62dd5d..d4779425 100644 --- a/packages/shorebird_cli/lib/src/platform/apple/apple.dart +++ b/packages/shorebird_cli/lib/src/platform/apple/apple.dart @@ -2,7 +2,6 @@ import 'dart:io'; import 'package:collection/collection.dart'; import 'package:path/path.dart' as p; -import 'package:pub_semver/pub_semver.dart'; import 'package:scoped_deps/scoped_deps.dart'; import 'package:shorebird_cli/src/archive/directory_archive.dart'; import 'package:shorebird_cli/src/commands/patch/patcher.dart'; @@ -23,12 +22,6 @@ export 'macho.dart'; export 'missing_xcode_project_exception.dart'; export 'plist.dart'; -/// The minimum allowed Flutter version for creating iOS releases. -final minimumSupportedIosFlutterVersion = Version(3, 22, 2); - -/// The minimum allowed Flutter version for creating macOS releases. -final minimumSupportedMacosFlutterVersion = Version(3, 27, 4); - /// A reference to a [Apple] instance. final appleRef = create(Apple.new); diff --git a/packages/shorebird_cli/lib/src/platform/linux/linux.dart b/packages/shorebird_cli/lib/src/platform/linux/linux.dart index 23d521a8..192ab363 100644 --- a/packages/shorebird_cli/lib/src/platform/linux/linux.dart +++ b/packages/shorebird_cli/lib/src/platform/linux/linux.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'dart:io'; import 'package:path/path.dart' as p; -import 'package:pub_semver/pub_semver.dart'; import 'package:scoped_deps/scoped_deps.dart'; /// The primary release artifact architecture for Linux releases. @@ -14,9 +13,6 @@ import 'package:scoped_deps/scoped_deps.dart'; /// - executable_flutter_app const primaryLinuxReleaseArtifactArch = 'bundle'; -/// The minimum allowed Flutter version for creating Linux releases. -final minimumSupportedLinuxFlutterVersion = Version(3, 27, 4); - /// A reference to a [Linux] instance. final linuxRef = create(Linux.new); diff --git a/packages/shorebird_cli/lib/src/platform/platform.dart b/packages/shorebird_cli/lib/src/platform/platform.dart index 034b6e3d..80c59c94 100644 --- a/packages/shorebird_cli/lib/src/platform/platform.dart +++ b/packages/shorebird_cli/lib/src/platform/platform.dart @@ -1,3 +1,5 @@ +export 'package:shorebird_cli/src/flutter_version_constraints.dart'; + export 'android/android.dart'; export 'apple/apple.dart'; export 'linux/linux.dart'; diff --git a/packages/shorebird_cli/lib/src/platform/windows/windows.dart b/packages/shorebird_cli/lib/src/platform/windows/windows.dart index 916e7853..7ca787bd 100644 --- a/packages/shorebird_cli/lib/src/platform/windows/windows.dart +++ b/packages/shorebird_cli/lib/src/platform/windows/windows.dart @@ -2,7 +2,6 @@ import 'dart:io'; import 'package:collection/collection.dart'; import 'package:path/path.dart' as p; -import 'package:pub_semver/pub_semver.dart'; import 'package:scoped_deps/scoped_deps.dart'; /// The primary release artifact architecture for Windows releases. @@ -14,9 +13,6 @@ import 'package:scoped_deps/scoped_deps.dart'; /// - data/, which contains flutter assets and the app.so file const primaryWindowsReleaseArtifactArch = 'win_archive'; -/// The minimum allowed Flutter version for creating Windows releases. -final minimumSupportedWindowsFlutterVersion = Version(3, 32, 6); - /// A reference to a [Windows] instance. final windowsRef = create(Windows.new); diff --git a/packages/shorebird_cli/test/src/platform/linux/linux_test.dart b/packages/shorebird_cli/test/src/platform/linux/linux_test.dart index a716b514..d9593709 100644 --- a/packages/shorebird_cli/test/src/platform/linux/linux_test.dart +++ b/packages/shorebird_cli/test/src/platform/linux/linux_test.dart @@ -1,6 +1,7 @@ import 'dart:io'; import 'package:pub_semver/pub_semver.dart'; +import 'package:shorebird_cli/src/flutter_version_constraints.dart'; import 'package:shorebird_cli/src/platform/linux/linux.dart'; import 'package:test/test.dart';