ensureAssets method

Future<void> ensureAssets(
  1. Iterable<AssetId> assetIds,
  2. AssetReader reader
)

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);
}