| Index: lib/src/entrypoint.dart
|
| diff --git a/lib/src/entrypoint.dart b/lib/src/entrypoint.dart
|
| index dc1a4a445f6f95eacab95ac2e73ee75c5f2fddd2..e0c6774a9c227945f26faff7fd8d843a585b76a8 100644
|
| --- a/lib/src/entrypoint.dart
|
| +++ b/lib/src/entrypoint.dart
|
| @@ -11,6 +11,7 @@ import 'package:path/path.dart' as p;
|
| import 'package:pub_semver/pub_semver.dart';
|
|
|
| import 'barback/asset_environment.dart';
|
| +import 'exceptions.dart';
|
| import 'io.dart';
|
| import 'lock_file.dart';
|
| import 'log.dart' as log;
|
| @@ -466,7 +467,8 @@ class Entrypoint {
|
| var touchedLockFile = false;
|
| if (lockFileModified.isBefore(pubspecModified) ||
|
| hasPathDependencies) {
|
| - if (_isLockFileUpToDate() && _arePackagesAvailable()) {
|
| + _assertLockFileUpToDate();
|
| + if (_arePackagesAvailable()) {
|
| touchedLockFile = true;
|
| touch(lockFilePath);
|
| } else {
|
| @@ -500,22 +502,36 @@ class Entrypoint {
|
| /// Determines whether or not the lockfile is out of date with respect to the
|
| /// pubspec.
|
| ///
|
| - /// This will be `false` if any mutable pubspec contains dependencies that are
|
| - /// not in the lockfile or that don't match what's in there.
|
| - bool _isLockFileUpToDate() {
|
| - if (!root.immediateDependencies.every(_isDependencyUpToDate)) return false;
|
| + /// If any mutable pubspec contains dependencies that are not in the lockfile
|
| + /// or that don't match what's in there, this will throw a [DataError]
|
| + /// describing the issue.
|
| + void _assertLockFileUpToDate() {
|
| + if (!root.immediateDependencies.every(_isDependencyUpToDate)) {
|
| + dataError('The pubspec.yaml file has changed since the pubspec.lock '
|
| + 'file was generated, please run "pub get" again.');
|
| + }
|
|
|
| var overrides = root.dependencyOverrides.map((dep) => dep.name).toSet();
|
|
|
| // Check that uncached dependencies' pubspecs are also still satisfied,
|
| // since they're mutable and may have changed since the last get.
|
| - return lockFile.packages.values.every((id) {
|
| - var source = cache.sources[id.name];
|
| - if (source is! CachedSource) return true;
|
| + for (var id in lockFile.packages.values) {
|
| + var source = cache.sources[id.source];
|
| + if (source is CachedSource) continue;
|
| +
|
| + try {
|
| + if (cache.sources.load(id).dependencies.every((dep) =>
|
| + overrides.contains(dep.name) || _isDependencyUpToDate(dep))) {
|
| + continue;
|
| + }
|
| + } on FileException {
|
| + // If we can't load the pubpsec, the user needs to re-run "pub get".
|
| + }
|
|
|
| - return cache.sources.load(id).dependencies.every((dep) =>
|
| - overrides.contains(dep.name) || _isDependencyUpToDate(dep));
|
| - });
|
| + dataError('${p.join(source.getDirectory(id), 'pubspec.yaml')} has '
|
| + 'changed since the pubspec.lock file was generated, please run "pub '
|
| + 'get" again.');
|
| + }
|
| }
|
|
|
| /// Returns whether the locked version of [dep] matches the dependency.
|
|
|