ensureAssets method
Copies assetIds
to tempDir if they don't exist, using reader
to
read assets and mark dependencies.
Note that BuildStep
implements AssetReader
and that is typically
what you will want to pass in.
Any asset that is under a lib
dir will be output under a packages
directory corresponding to its package, and any other assets are output
directly under the temp dir using their unmodified path.
Implementation
Future<void> ensureAssets(Iterable<AssetId> assetIds, AssetReader reader) {
if (!exists) {
throw StateError('Tried to use a deleted ScratchSpace!');
}
var futures = assetIds.map((id) async {
var digest = await reader.digest(id);
var existing = _digests[id];
if (digest == existing) {
await _pendingWrites[id];
return;
}
_digests[id] = digest;
try {
await _pendingWrites.putIfAbsent(
id,
() => _descriptorPool.withResource(() async {
var file = fileFor(id);
if (await file.exists()) {
await file.delete();
}
await file.create(recursive: true);
await file.writeAsBytes(await reader.readAsBytes(id));
}));
} finally {
// TODO: Remove ?? fallback once 2.15 hits stable.
unawaited(_pendingWrites.remove(id) ?? Future.value());
}
}).toList();
return Future.wait(futures);
}