Skip to content

Commit 83fad74

Browse files
authored
Expose build mode in environment of asset transformer processes (flutter#144752)
In service of flutter#143348 When invoking a package to transform an asset, we set `FLUTTER_BUILD_MODE` to the CLI name of the build mode being used. Inspired by flutter#101077 (comment): > Do transformers know whether they get executed in debug or release mode? I kinda imagine that being useful. Ex: There's a transformer that optimizes the file size of images. Depending on the amount and size of the images, that could take a significant amount of time. Therefore, I might want to only execute it in release builds. Note for the reviewer: the interesting part of this change can be found in the commit [set environment variable to build mode when running asset transformer�](flutter@579912d). The rest of the change is updating call sites with a new argument.
1 parent d98d842 commit 83fad74

File tree

13 files changed

+70
-9
lines changed

13 files changed

+70
-9
lines changed

packages/flutter_tools/lib/src/build_system/targets/assets.dart

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import '../../devfs.dart';
1515
import '../../flutter_manifest.dart';
1616
import '../build_system.dart';
1717
import '../depfile.dart';
18+
import '../exceptions.dart';
1819
import '../tools/asset_transformer.dart';
1920
import '../tools/scene_importer.dart';
2021
import '../tools/shader_compiler.dart';
@@ -35,7 +36,7 @@ Future<Depfile> copyAssets(
3536
Directory outputDirectory, {
3637
Map<String, DevFSContent> additionalContent = const <String, DevFSContent>{},
3738
required TargetPlatform targetPlatform,
38-
BuildMode? buildMode,
39+
required BuildMode buildMode,
3940
List<File> additionalInputs = const <File>[],
4041
String? flavor,
4142
}) async {
@@ -101,6 +102,7 @@ Future<Depfile> copyAssets(
101102
processManager: environment.processManager,
102103
fileSystem: environment.fileSystem,
103104
dartBinaryPath: environment.artifacts.getArtifactPath(Artifact.engineDartBinary),
105+
buildMode: buildMode,
104106
);
105107

106108
final Map<String, AssetBundleEntry> assetEntries = <String, AssetBundleEntry>{
@@ -186,7 +188,7 @@ Future<Depfile> copyAssets(
186188
// Copy deferred components assets only for release or profile builds.
187189
// The assets are included in assetBundle.entries as a normal asset when
188190
// building as debug.
189-
if (environment.defines[kDeferredComponents] == 'true' && buildMode != null) {
191+
if (environment.defines[kDeferredComponents] == 'true') {
190192
await Future.wait<void>(assetBundle.deferredComponentsEntries.entries.map<Future<void>>(
191193
(MapEntry<String, Map<String, AssetBundleEntry>> componentEntries) async {
192194
final Directory componentOutputDir =
@@ -343,6 +345,11 @@ class CopyAssets extends Target {
343345

344346
@override
345347
Future<void> build(Environment environment) async {
348+
final String? buildModeEnvironment = environment.defines[kBuildMode];
349+
if (buildModeEnvironment == null) {
350+
throw MissingDefineException(kBuildMode, name);
351+
}
352+
final BuildMode buildMode = BuildMode.fromCliName(buildModeEnvironment);
346353
final Directory output = environment
347354
.buildDir
348355
.childDirectory('flutter_assets');
@@ -351,6 +358,7 @@ class CopyAssets extends Target {
351358
environment,
352359
output,
353360
targetPlatform: TargetPlatform.android,
361+
buildMode: buildMode,
354362
flavor: environment.defines[kFlavor],
355363
);
356364
environment.depFileService.writeToFile(

packages/flutter_tools/lib/src/build_system/targets/ios.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,7 @@ abstract class IosAssetBundle extends Target {
503503
environment,
504504
assetDirectory,
505505
targetPlatform: TargetPlatform.ios,
506+
buildMode: buildMode,
506507
additionalInputs: <File>[
507508
flutterProject.ios.infoPlist,
508509
flutterProject.ios.appFrameworkInfoPlist,

packages/flutter_tools/lib/src/build_system/targets/linux.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ abstract class BundleLinuxAssets extends Target {
137137
environment,
138138
outputDirectory,
139139
targetPlatform: targetPlatform,
140+
buildMode: buildMode,
140141
additionalContent: <String, DevFSContent>{
141142
'version.json': DevFSStringContent(versionInfo),
142143
},

packages/flutter_tools/lib/src/build_system/targets/macos.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,7 @@ abstract class MacOSBundleFlutterAssets extends Target {
438438
environment,
439439
assetDirectory,
440440
targetPlatform: TargetPlatform.darwin,
441+
buildMode: buildMode,
441442
flavor: environment.defines[kFlavor],
442443
);
443444
environment.depFileService.writeToFile(

packages/flutter_tools/lib/src/build_system/targets/web.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,13 +380,21 @@ class WebReleaseBundle extends Target {
380380
}
381381
}
382382

383+
final String? buildModeEnvironment = environment.defines[kBuildMode];
384+
if (buildModeEnvironment == null) {
385+
throw MissingDefineException(kBuildMode, name);
386+
}
387+
final BuildMode buildMode = BuildMode.fromCliName(buildModeEnvironment);
388+
383389
createVersionFile(environment, environment.defines);
384390
final Directory outputDirectory = environment.outputDir.childDirectory('assets');
385391
outputDirectory.createSync(recursive: true);
392+
386393
final Depfile depfile = await copyAssets(
387394
environment,
388395
environment.outputDir.childDirectory('assets'),
389396
targetPlatform: TargetPlatform.web_javascript,
397+
buildMode: buildMode,
390398
);
391399
final DepfileService depfileService = environment.depFileService;
392400
depfileService.writeToFile(

packages/flutter_tools/lib/src/build_system/targets/windows.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ abstract class BundleWindowsAssets extends Target {
142142
environment,
143143
outputDirectory,
144144
targetPlatform: targetPlatform,
145+
buildMode: buildMode,
145146
);
146147
environment.depFileService.writeToFile(
147148
depfile,

packages/flutter_tools/lib/src/build_system/tools/asset_transformer.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import '../../base/error_handling_io.dart';
1212
import '../../base/file_system.dart';
1313
import '../../base/io.dart';
1414
import '../../base/logger.dart';
15+
import '../../build_info.dart';
1516
import '../../devfs.dart';
1617
import '../../flutter_manifest.dart';
1718
import '../build_system.dart';
@@ -22,13 +23,18 @@ final class AssetTransformer {
2223
required ProcessManager processManager,
2324
required FileSystem fileSystem,
2425
required String dartBinaryPath,
26+
required BuildMode buildMode,
2527
}) : _processManager = processManager,
2628
_fileSystem = fileSystem,
27-
_dartBinaryPath = dartBinaryPath;
29+
_dartBinaryPath = dartBinaryPath,
30+
_buildMode = buildMode;
31+
32+
static const String buildModeEnvVar = 'FLUTTER_BUILD_MODE';
2833

2934
final ProcessManager _processManager;
3035
final FileSystem _fileSystem;
3136
final String _dartBinaryPath;
37+
final BuildMode _buildMode;
3238

3339
/// The [Source] inputs that targets using this should depend on.
3440
///
@@ -115,6 +121,9 @@ final class AssetTransformer {
115121
final ProcessResult result = await _processManager.run(
116122
command,
117123
workingDirectory: workingDirectory,
124+
environment: <String, String>{
125+
AssetTransformer.buildModeEnvVar: _buildMode.cliName,
126+
}
118127
);
119128
final String stdout = result.stdout as String;
120129
final String stderr = result.stderr as String;

packages/flutter_tools/lib/src/devfs.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,7 @@ class DevFS {
442442
required FileSystem fileSystem,
443443
required ProcessManager processManager,
444444
required Artifacts artifacts,
445+
required BuildMode buildMode,
445446
HttpClient? httpClient,
446447
Duration? uploadRetryThrottle,
447448
StopwatchFactory stopwatchFactory = const StopwatchFactory(),
@@ -465,6 +466,7 @@ class DevFS {
465466
processManager: processManager,
466467
fileSystem: fileSystem,
467468
dartBinaryPath: artifacts.getArtifactPath(Artifact.engineDartBinary),
469+
buildMode: buildMode,
468470
),
469471
fileSystem: fileSystem,
470472
logger: logger,

packages/flutter_tools/lib/src/resident_runner.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,7 @@ class FlutterDevice {
387387
logger: globals.logger,
388388
processManager: globals.processManager,
389389
artifacts: globals.artifacts!,
390+
buildMode: buildInfo.mode,
390391
);
391392
return devFS!.create();
392393
}

packages/flutter_tools/test/general.shard/build_system/targets/asset_transformer_test.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:file_testing/file_testing.dart';
88
import 'package:flutter_tools/src/artifacts.dart';
99
import 'package:flutter_tools/src/base/file_system.dart';
1010
import 'package:flutter_tools/src/base/logger.dart';
11+
import 'package:flutter_tools/src/build_info.dart';
1112
import 'package:flutter_tools/src/build_system/tools/asset_transformer.dart';
1213
import 'package:flutter_tools/src/flutter_manifest.dart';
1314

@@ -53,6 +54,7 @@ void main() {
5354
processManager: processManager,
5455
fileSystem: fileSystem,
5556
dartBinaryPath: artifacts.getArtifactPath(Artifact.engineDartBinary),
57+
buildMode: BuildMode.debug,
5658
);
5759

5860
final AssetTransformationFailure? transformationFailure = await transformer.transformAsset(
@@ -112,6 +114,7 @@ void main() {
112114
processManager: processManager,
113115
fileSystem: fileSystem,
114116
dartBinaryPath: dartBinaryPath,
117+
buildMode: BuildMode.debug,
115118
);
116119

117120
final AssetTransformationFailure? failure = await transformer.transformAsset(
@@ -171,6 +174,7 @@ Something went wrong''');
171174
processManager: processManager,
172175
fileSystem: fileSystem,
173176
dartBinaryPath: dartBinaryPath,
177+
buildMode: BuildMode.debug,
174178
);
175179

176180
final AssetTransformationFailure? failure = await transformer.transformAsset(
@@ -265,6 +269,7 @@ Transformation failed, but I forgot to exit with a non-zero code.'''
265269
processManager: processManager,
266270
fileSystem: fileSystem,
267271
dartBinaryPath: dartBinaryPath,
272+
buildMode: BuildMode.debug,
268273
);
269274

270275
final AssetTransformationFailure? failure = await transformer.transformAsset(
@@ -331,14 +336,18 @@ Transformation failed, but I forgot to exit with a non-zero code.'''
331336
onRun: (List<String> args) {
332337
// Do nothing.
333338
},
334-
stderr: 'Transformation failed, but I forgot to exit with a non-zero code.'
339+
stderr: 'Transformation failed, but I forgot to exit with a non-zero code.',
340+
environment: const <String, String>{
341+
'FLUTTER_BUILD_MODE': 'debug',
342+
},
335343
),
336344
]);
337345

338346
final AssetTransformer transformer = AssetTransformer(
339347
processManager: processManager,
340348
fileSystem: fileSystem,
341349
dartBinaryPath: dartBinaryPath,
350+
buildMode: BuildMode.debug,
342351
);
343352

344353
final AssetTransformationFailure? failure = await transformer.transformAsset(

0 commit comments

Comments
 (0)