From 30f13d54fbd8ab6f988b1cb126c02cab965e1531 Mon Sep 17 00:00:00 2001 From: David Morgan Date: Fri, 14 Nov 2025 16:24:01 +0100 Subject: [PATCH] Fix build_modules for AOT. --- build_modules/CHANGELOG.md | 4 +++ build_modules/lib/src/scratch_space.dart | 25 ++++++++++++++++++- build_modules/pubspec.yaml | 2 +- .../integration_tests/web_compilers_test.dart | 8 +++++- 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/build_modules/CHANGELOG.md b/build_modules/CHANGELOG.md index af5747707..cc7b971f6 100644 --- a/build_modules/CHANGELOG.md +++ b/build_modules/CHANGELOG.md @@ -1,3 +1,7 @@ +## 5.1.2 + +- Make compatible with `dart run build_runner build --force-aot`. + ## 5.1.1 - Fix re-add `multiRootScheme` to build_modules exports. diff --git a/build_modules/lib/src/scratch_space.dart b/build_modules/lib/src/scratch_space.dart index 6c8bf35f3..f0b72f3d1 100644 --- a/build_modules/lib/src/scratch_space.dart +++ b/build_modules/lib/src/scratch_space.dart @@ -33,7 +33,7 @@ final scratchSpaceResource = Resource( p.join(scratchSpace.tempDir.path, '.dart_tool', 'package_config.json'), ); if (!packageConfigFile.existsSync()) { - final originalConfigFile = File.fromUri((await Isolate.packageConfig)!); + final originalConfigFile = await _findPackageConfig(); final packageConfigContents = _scratchSpacePackageConfig( originalConfigFile.readAsStringSync(), originalConfigFile.absolute.uri, @@ -134,3 +134,26 @@ String _scratchSpacePackageConfig(String rootConfig, Uri packageConfigUri) { } final Uri _currentDirUri = Directory.current.uri; + +/// Returns [Isolate.packageConfig], or finds the file if it's `null`. +/// +/// The `null` case is hit when the builder is AOT compiled. The build runs +/// within the package being built, so search upwards for the package config. +Future _findPackageConfig() async { + final result = await Isolate.packageConfig; + if (result != null) return File(result.toFilePath()); + var directory = Directory.current; + while (true) { + final packageConfigFile = File( + p.join(directory.path, '.dart_tool', 'package_config.json'), + ); + if (packageConfigFile.existsSync()) { + return packageConfigFile; + } + final parent = directory.parent; + if (parent.path == directory.path) { + throw StateError('Failed to find package_config.json.'); + } + directory = parent; + } +} diff --git a/build_modules/pubspec.yaml b/build_modules/pubspec.yaml index 3f2510fc5..257d5b96c 100644 --- a/build_modules/pubspec.yaml +++ b/build_modules/pubspec.yaml @@ -1,5 +1,5 @@ name: build_modules -version: 5.1.1 +version: 5.1.2 description: >- Builders to analyze and split Dart code into individually compilable modules based on imports. diff --git a/build_runner/test/integration_tests/web_compilers_test.dart b/build_runner/test/integration_tests/web_compilers_test.dart index d906f3d41..5e144d4e3 100644 --- a/build_runner/test/integration_tests/web_compilers_test.dart +++ b/build_runner/test/integration_tests/web_compilers_test.dart @@ -10,7 +10,7 @@ import 'package:test/test.dart'; import '../common/common.dart'; -const defaultTimeout = Timeout(Duration(seconds: 90)); +const defaultTimeout = Timeout(Duration(minutes: 3)); void main() async { test('web compilers', () async { @@ -55,6 +55,12 @@ void main() { }, ); + // Initial build AOT. + await tester.run( + 'root_pkg', + 'dart run build_runner build --output web:build --force-aot', + ); + // Initial build. await tester.run( 'root_pkg',