Error on acquireDependencies when the root pubspec has an unknown sdk in the environment. (#3271)
diff --git a/lib/src/entrypoint.dart b/lib/src/entrypoint.dart
index 453ef56..b54ec5e 100644
--- a/lib/src/entrypoint.dart
+++ b/lib/src/entrypoint.dart
@@ -10,6 +10,7 @@
import 'package:meta/meta.dart';
import 'package:path/path.dart' as p;
import 'package:pub_semver/pub_semver.dart';
+import 'package:yaml/yaml.dart';
import 'command_runner.dart';
import 'dart.dart' as dart;
@@ -250,8 +251,7 @@
SolveResult result;
try {
result = await log.progress('Resolving dependencies$suffix', () async {
- // We require an SDK constraint lower-bound as of Dart 2.12.0
- _checkSdkConstraintIsDefined(root.pubspec);
+ _checkSdkConstraint(root.pubspec);
return resolveVersions(
type,
cache,
@@ -872,7 +872,9 @@
}
/// We require an SDK constraint lower-bound as of Dart 2.12.0
- void _checkSdkConstraintIsDefined(Pubspec pubspec) {
+ ///
+ /// We don't allow unknown sdks.
+ void _checkSdkConstraint(Pubspec pubspec) {
final dartSdkConstraint = pubspec.sdkConstraints['dart'];
if (dartSdkConstraint is! VersionRange || dartSdkConstraint.min == null) {
// Suggest version range '>=2.10.0 <3.0.0', we avoid using:
@@ -902,6 +904,24 @@
See https://dart.dev/go/sdk-constraint
''');
}
+ for (final sdk in pubspec.sdkConstraints.keys) {
+ if (!sdks.containsKey(sdk)) {
+ final environment = pubspec.fields.nodes['environment'] as YamlMap;
+ final keyNode = environment.nodes.entries
+ .firstWhere((e) => (e.key as YamlNode).value == sdk)
+ .key as YamlNode;
+ throw PubspecException('''
+$pubspecPath refers to an unknown sdk '$sdk'.
+
+Did you mean to add it as a dependency?
+
+Either remove the constraint, or upgrade to a version of pub that supports the
+given sdk.
+
+See https://dart.dev/go/sdk-constraint
+''', keyNode.span);
+ }
+ }
}
}
diff --git a/test/get/unknown_sdk_test.dart b/test/get/unknown_sdk_test.dart
new file mode 100644
index 0000000..d0c1de3
--- /dev/null
+++ b/test/get/unknown_sdk_test.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:pub/src/exit_codes.dart' as exit_codes;
+import 'package:test/test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+void main() {
+ test('pub get barks at unknown sdk', () async {
+ await d.dir(appPath, [
+ d.pubspec({
+ 'environment': {'foo': '>=1.2.4 <2.0.0'}
+ })
+ ]).create();
+
+ await pubGet(
+ error: contains(
+ "Error on line 1, column 40 of pubspec.yaml: pubspec.yaml refers to an unknown sdk 'foo'."),
+ exitCode: exit_codes.DATA,
+ );
+ });
+}