Skip to content

Commit aa8e27a

Browse files
authored
Remove multi reader (#3857)
* Remove MultiAssetReader in favour of preloading source into memory. * Actually remove MultiAssetReader. * Address review comments.
1 parent 7dbcd85 commit aa8e27a

File tree

7 files changed

+44
-189
lines changed

7 files changed

+44
-189
lines changed

build_resolvers/test/resolver_test.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,8 @@ void runTests(ResolversFactory resolversFactory) {
361361
test('defaults to the current isolate package config', () async {
362362
await resolveSources({
363363
'a|web/main.dart': 'main() {}',
364+
}, nonInputsToReadFromFilesystem: {
365+
AssetId('build_resolvers', 'lib/build_resolvers.dart')
364366
}, (resolver) async {
365367
var buildResolversId =
366368
AssetId('build_resolvers', 'lib/build_resolvers.dart');

build_test/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@
66
- Breaking change: `testBuilder` no longer accepts a `reader` and a `writer`.
77
Instead it returns a `TestBuilderResult` with the `InMemoryAssetReaderWriter`
88
that was used.
9+
- Breaking change: `resolveSources` no longer automatically reads non-input
10+
files from the filesystem; specify explicitly which non-input files the
11+
test should read in `nonInputsToReadFromFilesystem`.
12+
- Breaking change: remove `MultiAssetReader`. Load the source into one
13+
in-memory reader instead of providing multiple readers.
914
- Support checks on reader state after a build action in `resolveSources`.
1015
- Start using `package:build/src/internal.dart`.
1116

build_test/lib/build_test.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ export 'src/globbing_builder.dart';
1111
export 'src/in_memory_reader.dart';
1212
export 'src/in_memory_writer.dart';
1313
export 'src/matchers.dart';
14-
export 'src/multi_asset_reader.dart' show MultiAssetReader;
1514
export 'src/package_reader.dart' show PackageAssetReader;
1615
export 'src/record_logs.dart';
1716
export 'src/resolve_source.dart'

build_test/lib/src/multi_asset_reader.dart

Lines changed: 0 additions & 75 deletions
This file was deleted.

build_test/lib/src/resolve_source.dart

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import 'package:build_resolvers/build_resolvers.dart';
1111
import 'package:package_config/package_config.dart';
1212

1313
import 'in_memory_reader.dart';
14-
import 'multi_asset_reader.dart';
1514
import 'package_reader.dart';
1615

1716
/// Marker constant that may be used in combination with [resolveSources].
@@ -27,6 +26,7 @@ Future<T> resolveSource<T>(
2726
FutureOr<T> Function(Resolver resolver) action, {
2827
AssetId? inputId,
2928
PackageConfig? packageConfig,
29+
Set<AssetId>? nonInputsToReadFromFilesystem,
3030
Future<void>? tearDown,
3131
Resolvers? resolvers,
3232
}) {
@@ -38,6 +38,7 @@ Future<T> resolveSource<T>(
3838
inputId.package,
3939
action,
4040
packageConfig: packageConfig,
41+
nonInputsToReadFromFilesystem: nonInputsToReadFromFilesystem,
4142
resolverFor: inputId,
4243
tearDown: tearDown,
4344
resolvers: resolvers,
@@ -120,6 +121,7 @@ Future<T> resolveSources<T>(
120121
Map<String, String> inputs,
121122
FutureOr<T> Function(Resolver resolver) action, {
122123
PackageConfig? packageConfig,
124+
Set<AssetId>? nonInputsToReadFromFilesystem,
123125
String? resolverFor,
124126
String? rootPackage,
125127
FutureOr<void> Function(InMemoryAssetReader)? assetReaderChecks,
@@ -134,6 +136,7 @@ Future<T> resolveSources<T>(
134136
rootPackage ?? AssetId.parse(inputs.keys.first).package,
135137
action,
136138
packageConfig: packageConfig,
139+
nonInputsToReadFromFilesystem: nonInputsToReadFromFilesystem,
137140
resolverFor: AssetId.parse(resolverFor ?? inputs.keys.first),
138141
assetReaderChecks: assetReaderChecks,
139142
tearDown: tearDown,
@@ -146,6 +149,7 @@ Future<T> resolveAsset<T>(
146149
AssetId inputId,
147150
FutureOr<T> Function(Resolver resolver) action, {
148151
PackageConfig? packageConfig,
152+
Set<AssetId>? nonInputsToReadFromFilesystem,
149153
Future<void>? tearDown,
150154
Resolvers? resolvers,
151155
}) {
@@ -156,6 +160,7 @@ Future<T> resolveAsset<T>(
156160
inputId.package,
157161
action,
158162
packageConfig: packageConfig,
163+
nonInputsToReadFromFilesystem: nonInputsToReadFromFilesystem,
159164
resolverFor: inputId,
160165
tearDown: tearDown,
161166
resolvers: resolvers,
@@ -172,19 +177,25 @@ Future<T> _resolveAssets<T>(
172177
String rootPackage,
173178
FutureOr<T> Function(Resolver resolver) action, {
174179
PackageConfig? packageConfig,
180+
Set<AssetId>? nonInputsToReadFromFilesystem,
175181
AssetId? resolverFor,
176182
FutureOr<void> Function(InMemoryAssetReader)? assetReaderChecks,
177183
Future<void>? tearDown,
178184
Resolvers? resolvers,
179185
}) async {
180186
final resolvedConfig = packageConfig ??
181187
await loadPackageConfigUri((await Isolate.packageConfig)!);
182-
final assetReader = PackageAssetReader(resolvedConfig, rootPackage);
183188
final resolveBuilder = _ResolveSourceBuilder(
184189
action,
185190
resolverFor,
186191
tearDown,
187192
);
193+
194+
// Prepare the in-memory filesystem the build will run on.
195+
//
196+
// First, add directly-passed [inputs], reading from the filesystem if the
197+
// string passed is [useAssetReader].
198+
final assetReader = PackageAssetReader(resolvedConfig, rootPackage);
188199
final inputAssets = <AssetId, String>{};
189200
await Future.wait(inputs.keys.map((String rawAssetId) async {
190201
final assetId = AssetId.parse(rawAssetId);
@@ -194,11 +205,19 @@ Future<T> _resolveAssets<T>(
194205
}
195206
inputAssets[assetId] = assetValue;
196207
}));
197-
final inMemory = InMemoryAssetReaderWriter(
208+
final readerWriter = InMemoryAssetReaderWriter(
198209
sourceAssets: inputAssets,
199210
rootPackage: rootPackage,
200211
);
201212

213+
// Then, copy any additionally requested files from the filesystem to the
214+
// in-memory filesystem.
215+
if (nonInputsToReadFromFilesystem != null) {
216+
for (final id in nonInputsToReadFromFilesystem) {
217+
await readerWriter.writeAsBytes(id, await assetReader.readAsBytes(id));
218+
}
219+
}
220+
202221
// Use the default resolver if no experiments are enabled. This is much
203222
// faster.
204223
resolvers ??= packageConfig == null && enabledExperiments.isEmpty
@@ -216,13 +235,13 @@ Future<T> _resolveAssets<T>(
216235
unawaited(runBuilder(
217236
resolveBuilder,
218237
inputAssets.keys,
219-
MultiAssetReader([inMemory, assetReader]),
220-
inMemory,
238+
readerWriter,
239+
readerWriter,
221240
resolvers,
222241
).catchError((_) {}));
223242
final result = await resolveBuilder.onDone.future;
224243
if (assetReaderChecks != null) {
225-
await assetReaderChecks(inMemory);
244+
await assetReaderChecks(readerWriter);
226245
}
227246
return result;
228247
}

build_test/test/multi_asset_reader_test.dart

Lines changed: 0 additions & 104 deletions
This file was deleted.

build_test/test/resolve_source_test.dart

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@ void main() {
4545
import 'package:collection/collection.dart';
4646
4747
abstract class Foo implements Equality {}
48-
''', (resolver) => resolver.findLibraryNotNull('example'));
48+
''', nonInputsToReadFromFilesystem: {
49+
AssetId('collection', 'lib/collection.dart'),
50+
AssetId('collection', 'lib/src/equality.dart'),
51+
}, (resolver) => resolver.findLibraryNotNull('example'));
4952
var classFoo = libExample.getClass('Foo')!;
5053
expect(
5154
classFoo.allSupertypes.map(_toStringId),
@@ -85,7 +88,10 @@ void main() {
8588
import 'package:collection/collection.dart';
8689
8790
abstract class Foo implements Equality {}
88-
''', (resolver) => resolver, tearDown: resolverDone.future);
91+
''', nonInputsToReadFromFilesystem: {
92+
AssetId('collection', 'lib/collection.dart'),
93+
AssetId('collection', 'lib/src/equality.dart'),
94+
}, (resolver) => resolver, tearDown: resolverDone.future);
8995
expect(
9096
await resolver.libraries.any((library) => library.name == 'example'),
9197
true);
@@ -105,7 +111,10 @@ void main() {
105111
import 'package:collection/collection.dart';
106112
107113
abstract class Foo implements Equality {}
108-
''', (resolver) async {
114+
''', nonInputsToReadFromFilesystem: {
115+
AssetId('collection', 'lib/collection.dart'),
116+
AssetId('collection', 'lib/src/equality.dart'),
117+
}, (resolver) async {
109118
var libExample = await resolver.findLibraryNotNull('example');
110119
var classFoo = libExample.getClass('Foo')!;
111120
expect(classFoo.allSupertypes.map(_toStringId),

0 commit comments

Comments
 (0)