Skip to content

Commit 89c864a

Browse files
eyebrowsoffiregilnobrega
authored andcommitted
Copy part files and sourcemaps when building with dart2js. (flutter#146356)
This fixes flutter#145653 When dart2js emits deferred part files, they need to be copied from the build folder to the output folder.
1 parent 10be98c commit 89c864a

File tree

2 files changed

+65
-19
lines changed
  • packages/flutter_tools

2 files changed

+65
-19
lines changed

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

Lines changed: 59 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ class WebEntrypointTarget extends Target {
9393
}
9494
}
9595

96-
/// Compiles a web entry point with dart2js.
9796
abstract class Dart2WebTarget extends Target {
9897
const Dart2WebTarget();
9998

@@ -102,7 +101,8 @@ abstract class Dart2WebTarget extends Target {
102101
WebCompilerConfig get compilerConfig;
103102

104103
Map<String, Object?> get buildConfig;
105-
List<String> get buildFiles;
104+
Iterable<File> buildFiles(Environment environment);
105+
Iterable<String> get buildPatternStems;
106106

107107
@override
108108
List<Target> get dependencies => const <Target>[
@@ -120,14 +120,15 @@ abstract class Dart2WebTarget extends Target {
120120
];
121121

122122
@override
123-
List<Source> get outputs => buildFiles.map(
124-
(String file) => Source.pattern('{BUILD_DIR}/$file')
125-
).toList();
123+
List<Source> get outputs => <Source>[
124+
for (final String stem in buildPatternStems) Source.pattern('{BUILD_DIR}/$stem'),
125+
];
126126

127127
@override
128128
String get buildKey => compilerConfig.buildKey;
129129
}
130130

131+
/// Compiles a web entry point with dart2js.
131132
class Dart2JSTarget extends Dart2WebTarget {
132133
Dart2JSTarget(this.compilerConfig);
133134

@@ -230,12 +231,43 @@ class Dart2JSTarget extends Dart2WebTarget {
230231
};
231232

232233
@override
233-
List<String> get buildFiles => <String>[
234+
Iterable<File> buildFiles(Environment environment)
235+
=> environment.buildDir
236+
.listSync(recursive: true)
237+
.whereType<File>()
238+
.where((File file) {
239+
if (file.basename == 'main.dart.js') {
240+
return true;
241+
}
242+
if (file.basename == 'main.dart.js.map') {
243+
return compilerConfig.sourceMaps;
244+
}
245+
final RegExp partFileRegex = RegExp(r'main\.dart\.js_[0-9].*\.part\.js');
246+
if (partFileRegex.hasMatch(file.basename)) {
247+
return true;
248+
}
249+
250+
if (compilerConfig.sourceMaps) {
251+
final RegExp partFileSourceMapRegex = RegExp(r'main\.dart\.js_[0-9].*.part\.js\.map');
252+
if (partFileSourceMapRegex.hasMatch(file.basename)) {
253+
return true;
254+
}
255+
}
256+
return false;
257+
});
258+
259+
@override
260+
Iterable<String> get buildPatternStems => <String>[
234261
'main.dart.js',
235-
if (compilerConfig.sourceMaps) 'main.dart.js.map',
262+
'main.dart.js_*.part.js',
263+
if (compilerConfig.sourceMaps) ...<String>[
264+
'main.dart.js.map',
265+
'main.dart.js_*.part.js.map',
266+
],
236267
];
237268
}
238269

270+
/// Compiles a web entry point with dart2wasm.
239271
class Dart2WasmTarget extends Dart2WebTarget {
240272
Dart2WasmTarget(this.compilerConfig);
241273

@@ -273,7 +305,7 @@ class Dart2WasmTarget extends Dart2WebTarget {
273305
if (compilerConfig.renderer == WebRendererMode.skwasm) ...<String>[
274306
'--extra-compiler-option=--import-shared-memory',
275307
'--extra-compiler-option=--shared-memory-max-pages=32768',
276-
],
308+
],
277309
if (buildMode == BuildMode.profile)
278310
'-Ddart.vm.profile=true'
279311
else
@@ -320,7 +352,17 @@ class Dart2WasmTarget extends Dart2WebTarget {
320352
};
321353

322354
@override
323-
List<String> get buildFiles => <String>[
355+
Iterable<File> buildFiles(Environment environment)
356+
=> environment.buildDir
357+
.listSync(recursive: true)
358+
.whereType<File>()
359+
.where((File file) => switch (file.basename) {
360+
'main.dart.wasm' || 'main.dart.mjs' => true,
361+
_ => false,
362+
});
363+
364+
@override
365+
Iterable<String> get buildPatternStems => const <String>[
324366
'main.dart.wasm',
325367
'main.dart.mjs',
326368
];
@@ -361,11 +403,6 @@ _flutter.buildConfig = ${jsonEncode(buildConfig)};
361403
final List<Dart2WebTarget> compileTargets;
362404
final WebTemplatedFiles templatedFilesTarget;
363405

364-
List<String> get buildFiles => compileTargets.fold(
365-
const Iterable<String>.empty(),
366-
(Iterable<String> current, Dart2WebTarget target) => current.followedBy(target.buildFiles)
367-
).toList();
368-
369406
@override
370407
String get name => 'web_release_bundle';
371408

@@ -375,15 +412,19 @@ _flutter.buildConfig = ${jsonEncode(buildConfig)};
375412
templatedFilesTarget,
376413
];
377414

415+
Iterable<String> get buildPatternStems => compileTargets.expand(
416+
(Dart2WebTarget target) => target.buildPatternStems,
417+
);
418+
378419
@override
379420
List<Source> get inputs => <Source>[
380421
const Source.pattern('{PROJECT_DIR}/pubspec.yaml'),
381-
...buildFiles.map((String file) => Source.pattern('{BUILD_DIR}/$file'))
422+
...buildPatternStems.map((String file) => Source.pattern('{BUILD_DIR}/$file'))
382423
];
383424

384425
@override
385426
List<Source> get outputs => <Source>[
386-
...buildFiles.map((String file) => Source.pattern('{OUTPUT_DIR}/$file'))
427+
...buildPatternStems.map((String file) => Source.pattern('{OUTPUT_DIR}/$file'))
387428
];
388429

389430
@override
@@ -395,9 +436,8 @@ _flutter.buildConfig = ${jsonEncode(buildConfig)};
395436
@override
396437
Future<void> build(Environment environment) async {
397438
final FileSystem fileSystem = environment.fileSystem;
398-
for (final File outputFile in environment.buildDir.listSync(recursive: true).whereType<File>()) {
399-
final String basename = fileSystem.path.basename(outputFile.path);
400-
if (buildFiles.contains(basename)) {
439+
for (final Dart2WebTarget target in compileTargets) {
440+
for (final File outputFile in target.buildFiles(environment)) {
401441
outputFile.copySync(
402442
environment.outputDir.childFile(fileSystem.path.basename(outputFile.path)).path
403443
);

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,8 @@ void main() {
170170
..writeAsStringSync('A');
171171
environment.buildDir.childFile('main.dart.js').createSync();
172172
environment.buildDir.childFile('main.dart.js.map').createSync();
173+
environment.buildDir.childFile('main.dart.js_1.part.js').createSync();
174+
environment.buildDir.childFile('main.dart.js_1.part.js.map').createSync();
173175

174176
await WebReleaseBundle(<WebCompilerConfig>[
175177
const JsCompilerConfig()
@@ -181,6 +183,10 @@ void main() {
181183
.existsSync(), true);
182184
expect(environment.outputDir.childFile('main.dart.js.map')
183185
.existsSync(), true);
186+
expect(environment.outputDir.childFile('main.dart.js_1.part.js')
187+
.existsSync(), true);
188+
expect(environment.outputDir.childFile('main.dart.js_1.part.js.map')
189+
.existsSync(), true);
184190
expect(environment.outputDir.childDirectory('assets')
185191
.childFile('AssetManifest.bin.json').existsSync(), true);
186192

0 commit comments

Comments
 (0)