Allow publishing packages with SDK dependencies on Flutter. (#1562)
Fix #1560.
diff --git a/lib/src/validator/dependency.dart b/lib/src/validator/dependency.dart
index e2f6c67..269a40f 100644
--- a/lib/src/validator/dependency.dart
+++ b/lib/src/validator/dependency.dart
@@ -12,6 +12,7 @@
import '../package.dart';
import '../source/hosted.dart';
import '../source/path.dart';
+import '../source/sdk.dart';
import '../validator.dart';
/// The range of all pub versions that don't support `^` version constraints.
@@ -41,7 +42,9 @@
for (var dependency in entrypoint.root.pubspec.dependencies) {
var constraint = dependency.constraint;
- if (dependency.source is! HostedSource) {
+ if (dependency.name == "flutter") {
+ _warnAboutFlutterSdk(dependency);
+ } else if (dependency.source is! HostedSource) {
await _warnAboutSource(dependency);
} else if (constraint.isAny) {
_warnAboutNoConstraint(dependency);
@@ -65,6 +68,20 @@
}
}
+ /// Warn about improper dependencies on Flutter.
+ void _warnAboutFlutterSdk(PackageDep dep) {
+ if (dep.source is SdkSource) return;
+
+ errors.add('Don\'t depend on "${dep.name}" from the ${dep.source} '
+ 'source. Use the SDK source instead. For example:\n'
+ '\n'
+ 'dependencies:\n'
+ ' ${dep.name}:\n'
+ ' sdk: ${dep.constraint}\n'
+ '\n'
+ 'The Flutter SDK is downloaded and managed outside of pub.');
+ }
+
/// Warn that dependencies should use the hosted source.
Future _warnAboutSource(PackageDep dep) async {
List<Version> versions;
diff --git a/test/validator/dependency_test.dart b/test/validator/dependency_test.dart
index f66a1e2..c5292a9 100644
--- a/test/validator/dependency_test.dart
+++ b/test/validator/dependency_test.dart
@@ -72,6 +72,16 @@
]).create();
expectNoValidationError(dependency);
});
+
+ integration('depends on Flutter from an SDK source', () {
+ d.dir(appPath, [
+ d.libPubspec("test_pkg", "1.0.0", deps: {
+ "flutter": {"sdk": ">=1.2.3 <2.0.0"}
+ })
+ ]).create();
+
+ expectNoValidationError(dependency);
+ });
});
group('should consider a package invalid if it', () {
@@ -418,5 +428,13 @@
expectDependencyValidationError(' foo: ">=1.2.3 <2.0.0"');
});
});
+
+ integration('depends on Flutter from a non-SDK source', () {
+ d.dir(appPath, [
+ d.libPubspec("test_pkg", "1.0.0", deps: {"flutter": ">=1.2.3 <2.0.0"})
+ ]).create();
+
+ expectDependencyValidationError('sdk: >=1.2.3 <2.0.0');
+ });
});
}