blob: cc7e2ab9c5ce765e5276bfd4d0a5c774fa81ffcc [file] [log] [blame]
// Copyright (c) 2012, 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 'dart:async';
import '../validator.dart';
/// Complains (with a hint) if any of the transitive dependencies of a package's
/// non-dev dependencies are overridden anywhere in the workspace.
class DependencyOverrideValidator extends Validator {
@override
Future<void> validate() async {
final graph = await context.entrypoint.packageGraph;
final transitiveNonDevDependencies = <String>{};
final toVisit = [package.name];
while (toVisit.isNotEmpty) {
final next = toVisit.removeLast();
if (transitiveNonDevDependencies.add(next)) {
toVisit.addAll(graph.packages[next]!.dependencies.keys);
}
}
for (final workspacePackage
in context.entrypoint.workspaceRoot.transitiveWorkspace) {
for (final override
in workspacePackage.pubspec.dependencyOverrides.keys) {
if (transitiveNonDevDependencies.contains(override)) {
final overridesFile =
workspacePackage.pubspec.dependencyOverridesFromOverridesFile
? workspacePackage.pubspecOverridesPath
: workspacePackage.pubspecPath;
hints.add('''
Non-dev dependencies are overridden in $overridesFile.
This indicates you are not testing your package against the same versions of its
dependencies that users will have when they use it.
This might be necessary for packages with cyclic dependencies.
Please be extra careful when publishing.''');
}
}
}
}
}