mirror of
https://github.com/flutter/packages.git
synced 2025-08-06 17:28:42 +08:00
[tool/ci] Add minimum supported SDK validation (#7028)
Adds options to `pubspec.yaml` to check that the minimum supported SDK range for Flutter/Dart is at least a given version, to add CI enforcement that we're updating all of our support claims when we update our tested versions (rather than it being something we have to remember to do), and enables it in CI. As part of enabling it, fixes some violations: - path_provider_foundation had been temporarily dropped back to 2.10 as part of pushing out a regression fix. - a number of examples were missing Flutter constraints even though they used Flutter. - the non-Flutter `plugin_platform_interface` package hadn't been update since I hadn't thought about Dart-only constraints in the past.
This commit is contained in:
@ -5,6 +5,7 @@
|
||||
import 'package:file/file.dart';
|
||||
import 'package:git/git.dart';
|
||||
import 'package:platform/platform.dart';
|
||||
import 'package:pub_semver/pub_semver.dart';
|
||||
import 'package:yaml/yaml.dart';
|
||||
|
||||
import 'common/core.dart';
|
||||
@ -29,7 +30,23 @@ class PubspecCheckCommand extends PackageLoopingCommand {
|
||||
processRunner: processRunner,
|
||||
platform: platform,
|
||||
gitDir: gitDir,
|
||||
);
|
||||
) {
|
||||
argParser.addOption(
|
||||
_minMinDartVersionFlag,
|
||||
help:
|
||||
'The minimum Dart version to allow as the minimum SDK constraint.\n\n'
|
||||
'This is only enforced for non-Flutter packages; Flutter packages '
|
||||
'use --$_minMinFlutterVersionFlag',
|
||||
);
|
||||
argParser.addOption(
|
||||
_minMinFlutterVersionFlag,
|
||||
help:
|
||||
'The minimum Flutter version to allow as the minimum SDK constraint.',
|
||||
);
|
||||
}
|
||||
|
||||
static const String _minMinDartVersionFlag = 'min-min-dart-version';
|
||||
static const String _minMinFlutterVersionFlag = 'min-min-flutter-version';
|
||||
|
||||
// Section order for plugins. Because the 'flutter' section is critical
|
||||
// information for plugins, and usually small, it goes near the top unlike in
|
||||
@ -100,6 +117,24 @@ class PubspecCheckCommand extends PackageLoopingCommand {
|
||||
printError('$listIndentation${sectionOrder.join('\n$listIndentation')}');
|
||||
}
|
||||
|
||||
final String minMinDartVersionString = getStringArg(_minMinDartVersionFlag);
|
||||
final String minMinFlutterVersionString =
|
||||
getStringArg(_minMinFlutterVersionFlag);
|
||||
final String? minVersionError = _checkForMinimumVersionError(
|
||||
pubspec,
|
||||
package,
|
||||
minMinDartVersion: minMinDartVersionString.isEmpty
|
||||
? null
|
||||
: Version.parse(minMinDartVersionString),
|
||||
minMinFlutterVersion: minMinFlutterVersionString.isEmpty
|
||||
? null
|
||||
: Version.parse(minMinFlutterVersionString),
|
||||
);
|
||||
if (minVersionError != null) {
|
||||
printError('$indentation$minVersionError');
|
||||
passing = false;
|
||||
}
|
||||
|
||||
if (isPlugin) {
|
||||
final String? implementsError =
|
||||
_checkForImplementsError(pubspec, package: package);
|
||||
@ -320,4 +355,43 @@ class PubspecCheckCommand extends PackageLoopingCommand {
|
||||
final String suffix = packageName.substring(parentName.length);
|
||||
return !nonImplementationSuffixes.contains(suffix);
|
||||
}
|
||||
|
||||
/// Validates that a Flutter package has a minimum SDK version constraint of
|
||||
/// at least [minMinFlutterVersion] (if provided), or that a non-Flutter
|
||||
/// package has a minimum SDK version constraint of [minMinDartVersion]
|
||||
/// (if provided).
|
||||
///
|
||||
/// Returns an error string if validation fails.
|
||||
String? _checkForMinimumVersionError(
|
||||
Pubspec pubspec,
|
||||
RepositoryPackage package, {
|
||||
Version? minMinDartVersion,
|
||||
Version? minMinFlutterVersion,
|
||||
}) {
|
||||
final VersionConstraint? dartConstraint = pubspec.environment?['sdk'];
|
||||
final VersionConstraint? flutterConstraint =
|
||||
pubspec.environment?['flutter'];
|
||||
|
||||
if (flutterConstraint != null) {
|
||||
// Validate Flutter packages against the Flutter requirement.
|
||||
if (minMinFlutterVersion != null) {
|
||||
final Version? constraintMin =
|
||||
flutterConstraint is VersionRange ? flutterConstraint.min : null;
|
||||
if ((constraintMin ?? Version(0, 0, 0)) < minMinFlutterVersion) {
|
||||
return 'Minimum allowed Flutter version $constraintMin is less than $minMinFlutterVersion';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Validate non-Flutter packages against the Dart requirement.
|
||||
if (minMinDartVersion != null) {
|
||||
final Version? constraintMin =
|
||||
dartConstraint is VersionRange ? dartConstraint.min : null;
|
||||
if ((constraintMin ?? Version(0, 0, 0)) < minMinDartVersion) {
|
||||
return 'Minimum allowed Dart version $constraintMin is less than $minMinDartVersion';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user