Skip to content

Commit da23eae

Browse files
authored
[native assets] Tool exit on build failure (flutter#137995)
If the native assets feature is enabled, and the `build.dart` invocation fails, the `flutter build` and `flutter run` should abort. Closes: flutter#137910
1 parent 5a6a322 commit da23eae

File tree

7 files changed

+269
-11
lines changed

7 files changed

+269
-11
lines changed

packages/flutter_tools/lib/src/ios/native_assets.dart

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5-
import 'package:native_assets_builder/native_assets_builder.dart' show BuildResult;
5+
import 'package:native_assets_builder/native_assets_builder.dart'
6+
show BuildResult, DryRunResult;
67
import 'package:native_assets_cli/native_assets_cli.dart' hide BuildMode;
78
import 'package:native_assets_cli/native_assets_cli.dart' as native_assets_cli;
89

@@ -48,13 +49,14 @@ Future<Iterable<Asset>> dryRunNativeAssetsIOSInternal(
4849
) async {
4950
const OS targetOS = OS.iOS;
5051
globals.logger.printTrace('Dry running native assets for $targetOS.');
51-
final List<Asset> nativeAssets = (await buildRunner.dryRun(
52+
final DryRunResult dryRunResult = await buildRunner.dryRun(
5253
linkModePreference: LinkModePreference.dynamic,
5354
targetOS: targetOS,
5455
workingDirectory: projectUri,
5556
includeParentEnvironment: true,
56-
))
57-
.assets;
57+
);
58+
ensureNativeAssetsBuildSucceed(dryRunResult);
59+
final List<Asset> nativeAssets = dryRunResult.assets;
5860
ensureNoLinkModeStatic(nativeAssets);
5961
globals.logger.printTrace('Dry running native assets for $targetOS done.');
6062
final Iterable<Asset> assetTargetLocations = _assetTargetLocations(nativeAssets).values;
@@ -97,6 +99,7 @@ Future<List<Uri>> buildNativeAssetsIOS({
9799
includeParentEnvironment: true,
98100
cCompilerConfig: await buildRunner.cCompilerConfig,
99101
);
102+
ensureNativeAssetsBuildSucceed(result);
100103
nativeAssets.addAll(result.assets);
101104
dependencies.addAll(result.dependencies);
102105
}

packages/flutter_tools/lib/src/macos/native_assets.dart

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5-
import 'package:native_assets_builder/native_assets_builder.dart' show BuildResult;
5+
import 'package:native_assets_builder/native_assets_builder.dart'
6+
show BuildResult, DryRunResult;
67
import 'package:native_assets_cli/native_assets_cli.dart' hide BuildMode;
78
import 'package:native_assets_cli/native_assets_cli.dart' as native_assets_cli;
89

@@ -43,13 +44,14 @@ Future<Iterable<Asset>> dryRunNativeAssetsMacOSInternal(
4344
final Uri buildUri = nativeAssetsBuildUri(projectUri, targetOS);
4445

4546
globals.logger.printTrace('Dry running native assets for $targetOS.');
46-
final List<Asset> nativeAssets = (await buildRunner.dryRun(
47+
final DryRunResult dryRunResult = await buildRunner.dryRun(
4748
linkModePreference: LinkModePreference.dynamic,
4849
targetOS: targetOS,
4950
workingDirectory: projectUri,
5051
includeParentEnvironment: true,
51-
))
52-
.assets;
52+
);
53+
ensureNativeAssetsBuildSucceed(dryRunResult);
54+
final List<Asset> nativeAssets = dryRunResult.assets;
5355
ensureNoLinkModeStatic(nativeAssets);
5456
globals.logger.printTrace('Dry running native assets for $targetOS done.');
5557
final Uri? absolutePath = flutterTester ? buildUri : null;
@@ -97,6 +99,7 @@ Future<(Uri? nativeAssetsYaml, List<Uri> dependencies)> buildNativeAssetsMacOS({
9799
includeParentEnvironment: true,
98100
cCompilerConfig: await buildRunner.cCompilerConfig,
99101
);
102+
ensureNativeAssetsBuildSucceed(result);
100103
nativeAssets.addAll(result.assets);
101104
dependencies.addAll(result.dependencies);
102105
}

packages/flutter_tools/lib/src/native_assets.dart

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -487,13 +487,15 @@ Future<Iterable<Asset>> dryRunNativeAssetsSingleArchitectureInternal(
487487
final Uri buildUri = nativeAssetsBuildUri(projectUri, targetOS);
488488

489489
globals.logger.printTrace('Dry running native assets for $targetOS.');
490-
final List<Asset> nativeAssets = (await buildRunner.dryRun(
490+
491+
final DryRunResult dryRunResult = await buildRunner.dryRun(
491492
linkModePreference: LinkModePreference.dynamic,
492493
targetOS: targetOS,
493494
workingDirectory: projectUri,
494495
includeParentEnvironment: true,
495-
))
496-
.assets;
496+
);
497+
ensureNativeAssetsBuildSucceed(dryRunResult);
498+
final List<Asset> nativeAssets = dryRunResult.assets;
497499
ensureNoLinkModeStatic(nativeAssets);
498500
globals.logger.printTrace('Dry running native assets for $targetOS done.');
499501
final Uri? absolutePath = flutterTester ? buildUri : null;
@@ -549,6 +551,7 @@ Future<(Uri? nativeAssetsYaml, List<Uri> dependencies)> buildNativeAssetsSingleA
549551
includeParentEnvironment: true,
550552
cCompilerConfig: await buildRunner.cCompilerConfig,
551553
);
554+
ensureNativeAssetsBuildSucceed(result);
552555
final List<Asset> nativeAssets = result.assets;
553556
final Set<Uri> dependencies = result.dependencies.toSet();
554557
ensureNoLinkModeStatic(nativeAssets);
@@ -655,3 +658,11 @@ Future<void> _copyNativeAssetsSingleArchitecture(
655658
globals.logger.printTrace('Copying native assets done.');
656659
}
657660
}
661+
662+
void ensureNativeAssetsBuildSucceed(DryRunResult result) {
663+
if (!result.success) {
664+
throwToolExit(
665+
'Building native assets failed. See the logs for more details.',
666+
);
667+
}
668+
}

packages/flutter_tools/test/general.shard/ios/native_assets_test.dart

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,4 +285,64 @@ void main() {
285285
exists,
286286
);
287287
});
288+
289+
testUsingContext('Native assets dry run error', overrides: <Type, Generator>{
290+
FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true),
291+
ProcessManager: () => FakeProcessManager.empty(),
292+
}, () async {
293+
final File packageConfig =
294+
environment.projectDir.childFile('.dart_tool/package_config.json');
295+
await packageConfig.parent.create();
296+
await packageConfig.create();
297+
expect(
298+
() => dryRunNativeAssetsIOS(
299+
projectUri: projectUri,
300+
fileSystem: fileSystem,
301+
buildRunner: FakeNativeAssetsBuildRunner(
302+
packagesWithNativeAssetsResult: <Package>[
303+
Package('bar', projectUri),
304+
],
305+
dryRunResult: const FakeNativeAssetsBuilderResult(
306+
success: false,
307+
),
308+
),
309+
),
310+
throwsToolExit(
311+
message:
312+
'Building native assets failed. See the logs for more details.',
313+
),
314+
);
315+
});
316+
317+
testUsingContext('Native assets build error', overrides: <Type, Generator>{
318+
FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true),
319+
ProcessManager: () => FakeProcessManager.empty(),
320+
}, () async {
321+
final File packageConfig =
322+
environment.projectDir.childFile('.dart_tool/package_config.json');
323+
await packageConfig.parent.create();
324+
await packageConfig.create();
325+
expect(
326+
() => buildNativeAssetsIOS(
327+
darwinArchs: <DarwinArch>[DarwinArch.arm64],
328+
environmentType: EnvironmentType.simulator,
329+
projectUri: projectUri,
330+
buildMode: BuildMode.debug,
331+
fileSystem: fileSystem,
332+
yamlParentDirectory: environment.buildDir.uri,
333+
buildRunner: FakeNativeAssetsBuildRunner(
334+
packagesWithNativeAssetsResult: <Package>[
335+
Package('bar', projectUri),
336+
],
337+
buildResult: const FakeNativeAssetsBuilderResult(
338+
success: false,
339+
),
340+
),
341+
),
342+
throwsToolExit(
343+
message:
344+
'Building native assets failed. See the logs for more details.',
345+
),
346+
);
347+
});
288348
}

packages/flutter_tools/test/general.shard/linux/native_assets_test.dart

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,65 @@ void main() {
360360
);
361361
});
362362

363+
testUsingContext('Native assets dry run error', overrides: <Type, Generator>{
364+
FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true),
365+
ProcessManager: () => FakeProcessManager.empty(),
366+
}, () async {
367+
final File packageConfig =
368+
environment.projectDir.childFile('.dart_tool/package_config.json');
369+
await packageConfig.parent.create();
370+
await packageConfig.create();
371+
expect(
372+
() => dryRunNativeAssetsLinux(
373+
projectUri: projectUri,
374+
fileSystem: fileSystem,
375+
buildRunner: FakeNativeAssetsBuildRunner(
376+
packagesWithNativeAssetsResult: <Package>[
377+
Package('bar', projectUri),
378+
],
379+
dryRunResult: const FakeNativeAssetsBuilderResult(
380+
success: false,
381+
),
382+
),
383+
),
384+
throwsToolExit(
385+
message:
386+
'Building native assets failed. See the logs for more details.',
387+
),
388+
);
389+
});
390+
391+
testUsingContext('Native assets build error', overrides: <Type, Generator>{
392+
FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true),
393+
ProcessManager: () => FakeProcessManager.empty(),
394+
}, () async {
395+
final File packageConfig =
396+
environment.projectDir.childFile('.dart_tool/package_config.json');
397+
await packageConfig.parent.create();
398+
await packageConfig.create();
399+
expect(
400+
() => buildNativeAssetsLinux(
401+
targetPlatform: TargetPlatform.linux_x64,
402+
projectUri: projectUri,
403+
buildMode: BuildMode.debug,
404+
fileSystem: fileSystem,
405+
yamlParentDirectory: environment.buildDir.uri,
406+
buildRunner: FakeNativeAssetsBuildRunner(
407+
packagesWithNativeAssetsResult: <Package>[
408+
Package('bar', projectUri),
409+
],
410+
buildResult: const FakeNativeAssetsBuilderResult(
411+
success: false,
412+
),
413+
),
414+
),
415+
throwsToolExit(
416+
message:
417+
'Building native assets failed. See the logs for more details.',
418+
),
419+
);
420+
});
421+
363422
// This logic is mocked in the other tests to avoid having test order
364423
// randomization causing issues with what processes are invoked.
365424
// Exercise the parsing of the process output in this separate test.

packages/flutter_tools/test/general.shard/macos/native_assets_test.dart

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,67 @@ void main() {
365365
);
366366
});
367367

368+
369+
370+
testUsingContext('Native assets dry run error', overrides: <Type, Generator>{
371+
FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true),
372+
ProcessManager: () => FakeProcessManager.empty(),
373+
}, () async {
374+
final File packageConfig =
375+
environment.projectDir.childFile('.dart_tool/package_config.json');
376+
await packageConfig.parent.create();
377+
await packageConfig.create();
378+
expect(
379+
() => dryRunNativeAssetsMacOS(
380+
projectUri: projectUri,
381+
fileSystem: fileSystem,
382+
buildRunner: FakeNativeAssetsBuildRunner(
383+
packagesWithNativeAssetsResult: <Package>[
384+
Package('bar', projectUri),
385+
],
386+
dryRunResult: const FakeNativeAssetsBuilderResult(
387+
success: false,
388+
),
389+
),
390+
),
391+
throwsToolExit(
392+
message:
393+
'Building native assets failed. See the logs for more details.',
394+
),
395+
);
396+
});
397+
398+
testUsingContext('Native assets build error', overrides: <Type, Generator>{
399+
FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true),
400+
ProcessManager: () => FakeProcessManager.empty(),
401+
}, () async {
402+
final File packageConfig =
403+
environment.projectDir.childFile('.dart_tool/package_config.json');
404+
await packageConfig.parent.create();
405+
await packageConfig.create();
406+
expect(
407+
() => buildNativeAssetsMacOS(
408+
darwinArchs: <DarwinArch>[DarwinArch.arm64],
409+
projectUri: projectUri,
410+
buildMode: BuildMode.debug,
411+
fileSystem: fileSystem,
412+
yamlParentDirectory: environment.buildDir.uri,
413+
buildRunner: FakeNativeAssetsBuildRunner(
414+
packagesWithNativeAssetsResult: <Package>[
415+
Package('bar', projectUri),
416+
],
417+
buildResult: const FakeNativeAssetsBuilderResult(
418+
success: false,
419+
),
420+
),
421+
),
422+
throwsToolExit(
423+
message:
424+
'Building native assets failed. See the logs for more details.',
425+
),
426+
);
427+
});
428+
368429
// This logic is mocked in the other tests to avoid having test order
369430
// randomization causing issues with what processes are invoked.
370431
// Exercise the parsing of the process output in this separate test.

packages/flutter_tools/test/general.shard/windows/native_assets_test.dart

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,67 @@ void main() {
325325
);
326326
});
327327

328+
329+
330+
testUsingContext('Native assets dry run error', overrides: <Type, Generator>{
331+
FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true),
332+
ProcessManager: () => FakeProcessManager.empty(),
333+
}, () async {
334+
final File packageConfig =
335+
environment.projectDir.childFile('.dart_tool/package_config.json');
336+
await packageConfig.parent.create();
337+
await packageConfig.create();
338+
expect(
339+
() => dryRunNativeAssetsWindows(
340+
projectUri: projectUri,
341+
fileSystem: fileSystem,
342+
buildRunner: FakeNativeAssetsBuildRunner(
343+
packagesWithNativeAssetsResult: <Package>[
344+
Package('bar', projectUri),
345+
],
346+
dryRunResult: const FakeNativeAssetsBuilderResult(
347+
success: false,
348+
),
349+
),
350+
),
351+
throwsToolExit(
352+
message:
353+
'Building native assets failed. See the logs for more details.',
354+
),
355+
);
356+
});
357+
358+
testUsingContext('Native assets build error', overrides: <Type, Generator>{
359+
FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true),
360+
ProcessManager: () => FakeProcessManager.empty(),
361+
}, () async {
362+
final File packageConfig =
363+
environment.projectDir.childFile('.dart_tool/package_config.json');
364+
await packageConfig.parent.create();
365+
await packageConfig.create();
366+
expect(
367+
() => buildNativeAssetsWindows(
368+
targetPlatform: TargetPlatform.windows_x64,
369+
projectUri: projectUri,
370+
buildMode: BuildMode.debug,
371+
fileSystem: fileSystem,
372+
yamlParentDirectory: environment.buildDir.uri,
373+
buildRunner: FakeNativeAssetsBuildRunner(
374+
packagesWithNativeAssetsResult: <Package>[
375+
Package('bar', projectUri),
376+
],
377+
buildResult: const FakeNativeAssetsBuilderResult(
378+
success: false,
379+
),
380+
),
381+
),
382+
throwsToolExit(
383+
message:
384+
'Building native assets failed. See the logs for more details.',
385+
),
386+
);
387+
});
388+
328389
// This logic is mocked in the other tests to avoid having test order
329390
// randomization causing issues with what processes are invoked.
330391
// Exercise the parsing of the process output in this separate test.

0 commit comments

Comments
 (0)