Info when publishing <3.0.0 constraint that is interpreted as <4.0.0 (#3752)
diff --git a/lib/src/pubspec.dart b/lib/src/pubspec.dart index fba6887..a1f84c1 100644 --- a/lib/src/pubspec.dart +++ b/lib/src/pubspec.dart
@@ -201,9 +201,7 @@ var yaml = parent['environment']; final VersionConstraint originalDartSdkConstraint; if (yaml == null) { - originalDartSdkConstraint = _includeDefaultSdkConstraint - ? _defaultUpperBoundSdkConstraint - : VersionConstraint.any; + originalDartSdkConstraint = VersionConstraint.any; } else if (yaml is! YamlMap) { _error( '"environment" field must be a map.', @@ -216,7 +214,6 @@ _FileType.pubspec, ); } - var constraints = { 'dart': _interpretDartSdkConstraint( originalDartSdkConstraint,
diff --git a/lib/src/validator/sdk_constraint.dart b/lib/src/validator/sdk_constraint.dart index a14d179..729981e 100644 --- a/lib/src/validator/sdk_constraint.dart +++ b/lib/src/validator/sdk_constraint.dart
@@ -17,25 +17,13 @@ /// * is not depending on a prerelease, unless the package itself is a /// prerelease. class SdkConstraintValidator extends Validator { - /// Get SDK version constraint from `pubspec.yaml` without any defaults or - /// overrides. - VersionConstraint _sdkConstraintFromPubspecYaml() { - final env = entrypoint.root.pubspec.fields['environment']; - if (env is Map && env['sdk'] is String) { - try { - return VersionConstraint.parse(env['sdk']); - } on FormatException { - // ignore - } - } - return VersionConstraint.any; - } - @override Future validate() async { - final dartConstraint = _sdkConstraintFromPubspecYaml(); - if (dartConstraint is VersionRange) { - if (dartConstraint.max == null) { + final dartConstraint = entrypoint.root.pubspec.dartSdkConstraint; + final originalConstraint = dartConstraint.originalConstraint; + final effectiveConstraint = dartConstraint.effectiveConstraint; + if (originalConstraint is VersionRange) { + if (originalConstraint.max == null) { errors.add( 'Published packages should have an upper bound constraint on the ' 'Dart SDK (typically this should restrict to less than the next ' @@ -44,7 +32,7 @@ 'instructions on setting an sdk version constraint.'); } - final constraintMin = dartConstraint.min; + final constraintMin = originalConstraint.min; final packageVersion = entrypoint.root.version; if (constraintMin != null && @@ -58,6 +46,21 @@ 'See https://dart.dev/tools/pub/publishing#publishing-prereleases ' 'For more information on pre-releases.'); } + if ( + // We only want to give this hint if there was no other problems with + // the sdk constraint. + warnings.isEmpty && + errors.isEmpty && + originalConstraint != effectiveConstraint) { + hints.add(''' +The declared SDK constraint is '$originalConstraint', this is interpreted as '$effectiveConstraint'. + +Consider updating the SDK constraint to: + +environment: + sdk: '$effectiveConstraint' +'''); + } } for (var sdk in sdks.values) {
diff --git a/test/validator/sdk_constraint_test.dart b/test/validator/sdk_constraint_test.dart index 0a0703a..4fb8f35 100644 --- a/test/validator/sdk_constraint_test.dart +++ b/test/validator/sdk_constraint_test.dart
@@ -167,5 +167,30 @@ ), ); }); + + test( + 'Gives a hint if package has a <3.0.0 constraint that is interpreted as <4.0.0', + () async { + await d.dir(appPath, [ + d.rawPubspec({ + 'name': 'test_pkg', + 'version': '1.0.0', + 'environment': {'sdk': '^2.19.0'} + }) + ]).create(); + await expectValidation( + sdkConstraint, + hints: anyElement( + ''' +The declared SDK constraint is '^2.19.0', this is interpreted as '>=2.19.0 <4.0.0'. + +Consider updating the SDK constraint to: + +environment: + sdk: '>=2.19.0 <4.0.0' +''', + ), + ); + }); }); }