diff --git a/lib/src/entrypoint.dart b/lib/src/entrypoint.dart index 5c2c8454d28963c6504371957d724f6a340add0b..811ae0bf7507e597b00cedf3fd8929d6ebcecdce 100644 --- a/lib/src/entrypoint.dart +++ b/lib/src/entrypoint.dart @@ -183,6 +183,22 @@ class Entrypoint { changed); }).map((package) => package.name).toSet(); + if (dirExists(depsDir)) { + // Delete any cached dependencies that are going to be recached. + for (var package in dependenciesToPrecompile) { + deleteEntry(path.join(depsDir, package)); + } + + // Also delete any cached dependencies that should no longer be cached. + for (var subdir in listDir(depsDir)) { + var package = graph.packages[path.basename(subdir)]; + if (package == null || package.pubspec.transformers.isEmpty || + graph.isPackageMutable(package.name)) { + deleteEntry(subdir); + } + } + } + if (dependenciesToPrecompile.isEmpty) return; await log.progress("Precompiling dependencies", () async { @@ -190,11 +206,6 @@ class Entrypoint { unionAll(dependenciesToPrecompile.map(graph.transitiveDependencies)) .map((package) => package.name).toSet(); - // TODO(nweiz): Use for/in here when - // https://github.com/dart-lang/async_await/issues/68 is fixed. - dependenciesToPrecompile.forEach((package) => - deleteEntry(path.join(depsDir, package))); - var environment = await AssetEnvironment.create(this, BarbackMode.DEBUG, packages: packagesToLoad, useDart2JS: false); diff --git a/test/get/cache_transformed_dependency_test.dart b/test/get/cache_transformed_dependency_test.dart index 613d9cbd99099a608bd6e98180b76344632abc3a..f19780569eb146c9e17582b15834aa22daca9899 100644 --- a/test/get/cache_transformed_dependency_test.dart +++ b/test/get/cache_transformed_dependency_test.dart @@ -376,6 +376,51 @@ main() { "lib/foo.dart: true, lib/does/not/exist.dart: false"); endPubServe(); }); + + // Regression test for issue 21810. + integration("decaches when the dependency is updated to something " + "untransformed", () { + servePackages((builder) { + builder.serveRepoPackage('barback'); + + builder.serve("foo", "1.2.3", + deps: {'barback': 'any'}, + pubspec: {'transformers': ['foo']}, + contents: [ + d.dir("lib", [ + d.file("transformer.dart", replaceTransformer("Hello", "Goodbye")), + d.file("foo.dart", "final message = 'Hello!';") + ]) + ]); + + builder.serve("foo", "1.2.4", + deps: {'barback': 'any'}, + contents: [ + d.dir("lib", [ + d.file("foo.dart", "final message = 'Hello!';") + ]) + ]); + }); + + d.appDir({"foo": "1.2.3"}).create(); + + pubGet(output: contains("Precompiled foo.")); + + d.dir(appPath, [ + d.dir(".pub/deps/debug/foo/lib", [ + d.file("foo.dart", "final message = 'Goodbye!';") + ]) + ]).validate(); + + // Upgrade to the new version of foo. + d.appDir({"foo": "1.2.4"}).create(); + + pubGet(output: isNot(contains("Precompiled foo."))); + + d.dir(appPath, [ + d.nothing(".pub/deps/debug/foo") + ]).validate(); + }); } String replaceTransformer(String input, String output) {