···299299 let changes = PackageChanges::between_manifests(&old_manifest, &manifest);
300300 telemetry.resolved_package_versions(&changes);
301301302302- // Invalidate build caches after removing package
303303- let target = config.target;
304304- let name = config.name.clone();
302302+ // Cleanup build cache of the root package if there are some changes.
303303+ // Without this, if a removed dependency is still used, teh build will
304304+ // succeed, resulting in runtime crash due to missing files.
305305+ if changes.any_changes() {
306306+ tracing::debug!("cleaning_root_package_build_cache");
307307+ for mode in Mode::iter() {
308308+ for target in Target::iter() {
309309+ let lock = BuildLock::new_target(paths, mode, target)?;
310310+ let _guard = lock.lock(&telemetry)?;
305311306306- // We need to clean build directory for the top level package for both dev
307307- // and prod modes
308308- for mode in [Mode::Dev, Mode::Prod] {
309309- let lock = BuildLock::new_target(paths, mode, target)?;
310310- let _guard = lock.lock(&telemetry)?;
311311-312312- let build_directory_path = paths.build_directory_for_package(mode, target, &name);
313313- fs::delete_directory(build_directory_path.as_ref())?;
312312+ let build_directory_path =
313313+ paths.build_directory_for_package(mode, target, &config.name);
314314+ if build_directory_path.exists() {
315315+ fs::delete_directory(build_directory_path.as_ref())?;
316316+ }
317317+ }
318318+ }
314319 }
315320316321 Ok(manifest)