From 4c46030927626782555918be39985ff95de83438 Mon Sep 17 00:00:00 2001 From: Andrew Kolos Date: Mon, 22 Apr 2024 09:37:24 -0700 Subject: [PATCH] print traces when transforming an asset (#146374) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From https://github.com/flutter/flutter/issues/143348#issuecomment-2016047148: > before we ship, we should add a printTrace to the tool about each asset transformer we're invoking and the path/arguments we called it with I think this is a good idea since asset transformers can be arbitrary Dart programs—meaning that a lot can go wrong when running them. For example, they can hang indefinitely or perform some sort of I/O that later results in a tool crash. Knowing that asset transformation was involved when debugging a crash (or a slow/stuck `flutter build`) could be useful, so I think adding a `printTrace` or two is a good idea (or at least not a bad one). --- .../lib/src/build_system/targets/assets.dart | 1 + .../lib/src/build_system/tools/asset_transformer.dart | 8 ++++++++ packages/flutter_tools/lib/src/bundle_builder.dart | 1 + .../build_system/targets/asset_transformer_test.dart | 5 +++++ 4 files changed, 15 insertions(+) diff --git a/packages/flutter_tools/lib/src/build_system/targets/assets.dart b/packages/flutter_tools/lib/src/build_system/targets/assets.dart index 77a5fc003a..4ffc08b939 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/assets.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/assets.dart @@ -150,6 +150,7 @@ Future copyAssets( outputPath: file.path, workingDirectory: environment.projectDir.path, transformerEntries: entry.value.transformers, + logger: environment.logger, ); doCopy = false; if (failure != null) { diff --git a/packages/flutter_tools/lib/src/build_system/tools/asset_transformer.dart b/packages/flutter_tools/lib/src/build_system/tools/asset_transformer.dart index 43ffd0d59a..be56ea84ff 100644 --- a/packages/flutter_tools/lib/src/build_system/tools/asset_transformer.dart +++ b/packages/flutter_tools/lib/src/build_system/tools/asset_transformer.dart @@ -52,6 +52,7 @@ final class AssetTransformer { required String outputPath, required String workingDirectory, required List transformerEntries, + required Logger logger, }) async { String getTempFilePath(int transformStep) { @@ -65,6 +66,7 @@ final class AssetTransformer { File tempOutputFile = _fileSystem.systemTempDirectory.childFile(getTempFilePath(1)); ErrorHandlingFileSystem.deleteIfExists(tempOutputFile); + final Stopwatch stopwatch = Stopwatch()..start(); try { for (final (int i, AssetTransformerEntry transformer) in transformerEntries.indexed) { final AssetTransformationFailure? transformerFailure = await _applyTransformer( @@ -72,6 +74,7 @@ final class AssetTransformer { output: tempOutputFile, transformer: transformer, workingDirectory: workingDirectory, + logger: logger, ); if (transformerFailure != null) { @@ -91,6 +94,8 @@ final class AssetTransformer { ErrorHandlingFileSystem.deleteIfExists(tempOutputFile); } } + + logger.printTrace("Finished transforming asset at path '${asset.path}' (${stopwatch.elapsedMilliseconds}ms)"); } finally { ErrorHandlingFileSystem.deleteIfExists(tempInputFile); ErrorHandlingFileSystem.deleteIfExists(tempOutputFile); @@ -104,6 +109,7 @@ final class AssetTransformer { required File output, required AssetTransformerEntry transformer, required String workingDirectory, + required Logger logger, }) async { final List transformerArguments = [ '--input=${asset.absolute.path}', @@ -118,6 +124,7 @@ final class AssetTransformer { ...transformerArguments, ]; + logger.printTrace("Transforming asset using command '${command.join(' ')}'"); final ProcessResult result = await _processManager.run( command, workingDirectory: workingDirectory, @@ -199,6 +206,7 @@ final class DevelopmentAssetTransformer { outputPath: output.path, transformerEntries: transformerEntries, workingDirectory: workingDirectory, + logger: _logger, ); if (failure != null) { _logger.printError(failure.message); diff --git a/packages/flutter_tools/lib/src/bundle_builder.dart b/packages/flutter_tools/lib/src/bundle_builder.dart index 010e3b67ae..302d023ef5 100644 --- a/packages/flutter_tools/lib/src/bundle_builder.dart +++ b/packages/flutter_tools/lib/src/bundle_builder.dart @@ -209,6 +209,7 @@ Future writeBundle( outputPath: file.path, workingDirectory: projectDir.path, transformerEntries: entry.value.transformers, + logger: logger, ); doCopy = false; if (failure != null) { diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/asset_transformer_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/asset_transformer_test.dart index 9e017573b0..84305555a4 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/asset_transformer_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/asset_transformer_test.dart @@ -71,6 +71,7 @@ void main() { ], ) ], + logger: logger, ); expect(transformationFailure, isNull, reason: logger.errorText); @@ -127,6 +128,7 @@ void main() { args: [], ) ], + logger: BufferLogger.test(), ); expect(asset, exists); @@ -187,6 +189,7 @@ Something went wrong'''); args: [], ) ], + logger: BufferLogger.test(), ); expect(processManager, hasNoRemainingExpectations); @@ -286,6 +289,7 @@ Transformation failed, but I forgot to exit with a non-zero code.''' args: [], ), ], + logger: BufferLogger.test(), ); expect(processManager, hasNoRemainingExpectations); @@ -364,6 +368,7 @@ Transformation failed, but I forgot to exit with a non-zero code.''' args: [], ), ], + logger: BufferLogger.test(), ); expect(failure, isNotNull);