in build_runner_core/lib/src/generate/build_definition.dart [339:418]
Future<AssetGraph?> _tryReadCachedAssetGraph() async {
final assetGraphId =
AssetId(_options.packageGraph.root.name, assetGraphPath);
if (!await _environment.reader.canRead(assetGraphId)) {
return null;
}
return logTimedAsync(_logger, 'Reading cached asset graph', () async {
try {
var cachedGraph = AssetGraph.deserialize(
await _environment.reader.readAsBytes(assetGraphId));
var buildPhasesChanged = computeBuildPhasesDigest(_buildPhases) !=
cachedGraph.buildPhasesDigest;
var pkgVersionsChanged = !const DeepCollectionEquality()
.equals(cachedGraph.packageLanguageVersions, {
for (var pkg in _options.packageGraph.allPackages.values)
pkg.name: pkg.languageVersion
});
var enabledExperimentsChanged =
!const DeepCollectionEquality.unordered()
.equals(cachedGraph.enabledExperiments, enabledExperiments);
if (buildPhasesChanged ||
pkgVersionsChanged ||
enabledExperimentsChanged) {
if (buildPhasesChanged) {
_logger.warning(
'Throwing away cached asset graph because the build phases have '
'changed. This most commonly would happen as a result of adding a '
'new dependency or updating your dependencies.');
}
if (pkgVersionsChanged) {
_logger.warning(
'Throwing away cached asset graph because the language '
'version of some package(s) changed. This would most commonly '
'happen when updating dependencies or changing your min sdk '
'constraint.');
}
if (enabledExperimentsChanged) {
_logger.warning(
'Throwing away cached asset graph because the enabled Dart '
'language experiments changed:\n\n'
'Previous value: ${cachedGraph.enabledExperiments.join(' ')}\n'
'Current value: ${enabledExperiments.join(' ')}');
}
await Future.wait([
_deleteAssetGraph(_options.packageGraph),
_cleanupOldOutputs(cachedGraph),
FailureReporter.cleanErrorCache(),
]);
if (_runningFromSnapshot) {
throw BuildScriptChangedException();
}
return null;
}
if (!isSameSdkVersion(cachedGraph.dartVersion, Platform.version)) {
_logger.warning(
'Throwing away cached asset graph due to Dart SDK update.');
await Future.wait([
_deleteAssetGraph(_options.packageGraph),
_cleanupOldOutputs(cachedGraph),
FailureReporter.cleanErrorCache(),
]);
if (_runningFromSnapshot) {
throw BuildScriptChangedException();
}
return null;
}
return cachedGraph;
} on AssetGraphCorruptedException catch (_) {
// Start fresh if the cached asset_graph cannot be deserialized
_logger.warning('Throwing away cached asset graph due to '
'version mismatch or corrupted asset graph.');
await Future.wait([
_deleteGeneratedDir(),
FailureReporter.cleanErrorCache(),
]);
return null;
}
});
}