@@ -15,7 +15,6 @@ import 'package:path/path.dart' as p;
15
15
import 'package:watcher/watcher.dart' ;
16
16
17
17
import '../bootstrap/build_process_state.dart' ;
18
- import '../build_plan/build_directory.dart' ;
19
18
import '../build_plan/build_options.dart' ;
20
19
import '../build_plan/build_phases.dart' ;
21
20
import '../build_plan/build_plan.dart' ;
@@ -24,6 +23,7 @@ import '../build_plan/phase.dart';
24
23
import '../build_plan/target_graph.dart' ;
25
24
import '../build_plan/testing_overrides.dart' ;
26
25
import '../constants.dart' ;
26
+ import '../io/build_output_reader.dart' ;
27
27
import '../io/create_merged_dir.dart' ;
28
28
import '../io/reader_writer.dart' ;
29
29
import '../logging/build_log.dart' ;
@@ -33,12 +33,10 @@ import 'asset_graph/node.dart';
33
33
import 'asset_graph/post_process_build_step_id.dart' ;
34
34
import 'build_dirs.dart' ;
35
35
import 'build_result.dart' ;
36
- import 'finalized_assets_view.dart' ;
37
36
import 'input_tracker.dart' ;
38
37
import 'library_cycle_graph/asset_deps_loader.dart' ;
39
38
import 'library_cycle_graph/library_cycle_graph.dart' ;
40
39
import 'library_cycle_graph/library_cycle_graph_loader.dart' ;
41
- import 'optional_output_tracker.dart' ;
42
40
import 'performance_tracker.dart' ;
43
41
import 'performance_tracking_resolvers.dart' ;
44
42
import 'resolver/analysis_driver_model.dart' ;
@@ -110,6 +108,9 @@ class Build {
110
108
/// transitive source.
111
109
final Map <LibraryCycleGraph , bool > changedGraphs = Map .identity ();
112
110
111
+ /// The build output.
112
+ final BuildOutputReader buildOutputReader;
113
+
113
114
Build ({
114
115
required this .buildPlan,
115
116
required this .readerWriter,
@@ -122,7 +123,12 @@ class Build {
122
123
previousDepsLoader =
123
124
assetGraph.previousPhasedAssetDeps == null
124
125
? null
125
- : AssetDepsLoader .fromDeps (assetGraph.previousPhasedAssetDeps! );
126
+ : AssetDepsLoader .fromDeps (assetGraph.previousPhasedAssetDeps! ),
127
+ buildOutputReader = BuildOutputReader (
128
+ buildPlan: buildPlan,
129
+ readerWriter: readerWriter,
130
+ assetGraph: assetGraph,
131
+ );
126
132
127
133
BuildOptions get buildOptions => buildPlan.buildOptions;
128
134
TestingOverrides get testingOverrides => buildPlan.testingOverrides;
@@ -138,13 +144,6 @@ class Build {
138
144
(b) => b..rootPackageName = packageGraph.root.name,
139
145
);
140
146
var result = await _safeBuild (updates);
141
- final optionalOutputTracker = OptionalOutputTracker (
142
- assetGraph,
143
- targetGraph,
144
- BuildDirectory .buildPaths (buildPlan.buildOptions.buildDirs),
145
- buildPlan.buildOptions.buildFilters,
146
- buildPhases,
147
- );
148
147
if (result.status == BuildStatus .success) {
149
148
final failures = < AssetNode > [];
150
149
for (final output in processedOutputs) {
@@ -169,21 +168,31 @@ class Build {
169
168
logger.severe (error);
170
169
}
171
170
}
172
- result = BuildResult (
173
- BuildStatus .failure,
174
- result.outputs,
175
- performance: result.performance,
176
- );
171
+ result = result.copyWith (status: BuildStatus .failure);
177
172
}
178
173
}
179
174
readerWriter.cache.flush ();
180
175
await resourceManager.disposeAll ();
181
- result = await _finalizeBuild (
182
- result,
183
- FinalizedAssetsView (assetGraph, packageGraph, optionalOutputTracker),
184
- readerWriter,
185
- buildPlan.buildOptions.buildDirs,
186
- );
176
+
177
+ // If requested, create output directories. If that fails, fail the build.
178
+ if (buildPlan.buildOptions.buildDirs.any (
179
+ (target) => target.outputLocation? .path.isNotEmpty ?? false ,
180
+ ) &&
181
+ result.status == BuildStatus .success) {
182
+ if (! await createMergedOutputDirectories (
183
+ packageGraph: packageGraph,
184
+ outputSymlinksOnly: buildOptions.outputSymlinksOnly,
185
+ buildDirs: buildOptions.buildDirs,
186
+ buildOutputReader: buildOutputReader,
187
+ readerWriter: readerWriter,
188
+ )) {
189
+ result = result.copyWith (
190
+ status: BuildStatus .failure,
191
+ failureType: FailureType .cantCreate,
192
+ );
193
+ }
194
+ }
195
+
187
196
_resolvers.reset ();
188
197
buildLog.finishBuild (
189
198
result: result.status == BuildStatus .success,
@@ -282,7 +291,13 @@ class Build {
282
291
buildLog.error (
283
292
buildLog.renderThrowable ('Unhandled build failure!' , e, st),
284
293
);
285
- done.complete (BuildResult (BuildStatus .failure, []));
294
+ done.complete (
295
+ BuildResult (
296
+ status: BuildStatus .failure,
297
+ outputs: BuiltList (),
298
+ buildOutputReader: buildOutputReader,
299
+ ),
300
+ );
286
301
}
287
302
},
288
303
);
@@ -372,9 +387,10 @@ class Build {
372
387
);
373
388
// Assume success, `_assetGraph.failedOutputs` will be checked later.
374
389
return BuildResult (
375
- BuildStatus .success,
376
- outputs,
390
+ status : BuildStatus .success,
391
+ outputs: outputs. build () ,
377
392
performance: performanceTracker,
393
+ buildOutputReader: buildOutputReader,
378
394
);
379
395
});
380
396
}
@@ -394,7 +410,7 @@ class Build {
394
410
.toList (growable: false )) {
395
411
if (! shouldBuildForDirs (
396
412
node.id,
397
- buildDirs: BuildDirectory . buildPaths ( buildPlan.buildOptions.buildDirs) ,
413
+ buildDirs: buildPlan.buildOptions.buildDirs,
398
414
buildFilters: buildPlan.buildOptions.buildFilters,
399
415
phase: phase,
400
416
targetGraph: targetGraph,
@@ -1211,60 +1227,6 @@ class Build {
1211
1227
}
1212
1228
1213
1229
Future _delete (AssetId id) => readerWriter.delete (id);
1214
-
1215
- /// Invoked after each build, can modify the [BuildResult] in any way, even
1216
- /// converting it to a failure.
1217
- ///
1218
- /// The [finalizedAssetsView] can only be used until the returned [Future]
1219
- /// completes, it will expire afterwords since it can no longer guarantee a
1220
- /// consistent state.
1221
- ///
1222
- /// By default this returns the original result.
1223
- ///
1224
- /// Any operation may be performed, as determined by environment.
1225
- Future <BuildResult > _finalizeBuild (
1226
- BuildResult buildResult,
1227
- FinalizedAssetsView finalizedAssetsView,
1228
- ReaderWriter readerWriter,
1229
- BuiltSet <BuildDirectory > buildDirs,
1230
- ) async {
1231
- if (testingOverrides.finalizeBuild != null ) {
1232
- return testingOverrides.finalizeBuild !(
1233
- buildResult,
1234
- finalizedAssetsView,
1235
- readerWriter,
1236
- buildDirs,
1237
- );
1238
- }
1239
- if (buildDirs.any (
1240
- (target) => target.outputLocation? .path.isNotEmpty ?? false ,
1241
- ) &&
1242
- buildResult.status == BuildStatus .success) {
1243
- if (! await createMergedOutputDirectories (
1244
- buildDirs,
1245
- packageGraph,
1246
- readerWriter,
1247
- finalizedAssetsView,
1248
- buildOptions.outputSymlinksOnly,
1249
- )) {
1250
- return _convertToFailure (
1251
- buildResult,
1252
- failureType: FailureType .cantCreate,
1253
- );
1254
- }
1255
- }
1256
- return buildResult;
1257
- }
1258
1230
}
1259
1231
1260
1232
String _twoDigits (int n) => '$n ' .padLeft (2 , '0' );
1261
-
1262
- BuildResult _convertToFailure (
1263
- BuildResult previous, {
1264
- FailureType ? failureType,
1265
- }) => BuildResult (
1266
- BuildStatus .failure,
1267
- previous.outputs,
1268
- performance: previous.performance,
1269
- failureType: failureType,
1270
- );
0 commit comments