@@ -22,12 +22,18 @@ import '../base/logger.dart';
22
22
import '../base/process_manager.dart' ;
23
23
import '../codegen.dart' ;
24
24
import '../convert.dart' ;
25
+ import '../dart/package_map.dart' ;
25
26
import '../dart/pub.dart' ;
26
27
import '../globals.dart' ;
27
28
import '../project.dart' ;
28
29
import '../resident_runner.dart' ;
29
30
import 'build_script_generator.dart' ;
30
31
32
+ // Arbitrarily choosen multi-root file scheme. This is used to configure the
33
+ // frontend_server to resolve a package uri to multiple filesystem directories.
34
+ // In this case, the source directory and a generated directory.
35
+ const String _kMultirootScheme = 'org-dartlang-app' ;
36
+
31
37
/// A wrapper for a build_runner process which delegates to a generated
32
38
/// build script.
33
39
///
@@ -37,7 +43,7 @@ class BuildRunner extends CodeGenerator {
37
43
const BuildRunner ();
38
44
39
45
@override
40
- Future <CodeGenerationResult > build ({
46
+ Future <CodeGenerationResult > build (FlutterProject flutterProject, {
41
47
@required String mainPath,
42
48
@required bool aot,
43
49
@required bool linkPlatformKernelIn,
@@ -46,8 +52,7 @@ class BuildRunner extends CodeGenerator {
46
52
List <String > extraFrontEndOptions = const < String > [],
47
53
bool disableKernelGeneration = false ,
48
54
}) async {
49
- await generateBuildScript ();
50
- final FlutterProject flutterProject = await FlutterProject .current ();
55
+ await generateBuildScript (flutterProject);
51
56
final String frontendServerPath = artifacts.getArtifactPath (
52
57
Artifact .frontendServerSnapshotForEngineDartSdk
53
58
);
@@ -99,7 +104,7 @@ class BuildRunner extends CodeGenerator {
99
104
status.stop ();
100
105
}
101
106
if (disableKernelGeneration) {
102
- return const CodeGenerationResult (null , null );
107
+ return const CodeGenerationResult (null );
103
108
}
104
109
/// We don't check for this above because it might be generated for the
105
110
/// first time by invoking the build.
@@ -114,21 +119,17 @@ class BuildRunner extends CodeGenerator {
114
119
throw Exception ('build_runner cannot find generated directory' );
115
120
}
116
121
final String relativeMain = fs.path.relative (mainPath, from: flutterProject.directory.path);
117
- final File packagesFile = fs.file (
118
- fs.path.join (generatedDirectory.path, fs.path.setExtension (relativeMain, '.packages' ))
119
- );
120
122
final File dillFile = fs.file (
121
123
fs.path.join (generatedDirectory.path, fs.path.setExtension (relativeMain, '.app.dill' ))
122
124
);
123
- if (! packagesFile. existsSync () || ! dillFile.existsSync ()) {
125
+ if (! dillFile.existsSync ()) {
124
126
throw Exception ('build_runner did not produce output at expected location: ${dillFile .path } missing' );
125
127
}
126
- return CodeGenerationResult (packagesFile, dillFile);
128
+ return CodeGenerationResult (dillFile);
127
129
}
128
130
129
131
@override
130
- Future <void > generateBuildScript () async {
131
- final FlutterProject flutterProject = await FlutterProject .current ();
132
+ Future <void > generateBuildScript (FlutterProject flutterProject) async {
132
133
final Directory entrypointDirectory = fs.directory (fs.path.join (flutterProject.dartTool.path, 'build' , 'entrypoint' ));
133
134
final Directory generatedDirectory = fs.directory (fs.path.join (flutterProject.dartTool.path, 'flutter_tool' ));
134
135
final File buildScript = entrypointDirectory.childFile ('build.dart' );
@@ -180,7 +181,6 @@ class BuildRunner extends CodeGenerator {
180
181
stringBuffer.writeln (' flutter_build:' );
181
182
stringBuffer.writeln (' sdk: flutter' );
182
183
syntheticPubspec.writeAsStringSync (stringBuffer.toString ());
183
-
184
184
await pubGet (
185
185
context: PubContext .pubGet,
186
186
directory: generatedDirectory.path,
@@ -210,16 +210,16 @@ class BuildRunner extends CodeGenerator {
210
210
}
211
211
212
212
@override
213
- Future <CodegenDaemon > daemon ({
213
+ Future <CodegenDaemon > daemon (FlutterProject flutterProject, {
214
214
String mainPath,
215
215
bool linkPlatformKernelIn = false ,
216
216
bool targetProductVm = false ,
217
217
bool trackWidgetCreation = false ,
218
218
List <String > extraFrontEndOptions = const < String > [],
219
219
}) async {
220
220
mainPath ?? = findMainDartFile ();
221
- await generateBuildScript ();
222
- final FlutterProject flutterProject = await FlutterProject . current ( );
221
+ await generateBuildScript (flutterProject );
222
+ _generatePackages (flutterProject );
223
223
final String frontendServerPath = artifacts.getArtifactPath (
224
224
Artifact .frontendServerSnapshotForEngineDartSdk
225
225
);
@@ -265,19 +265,28 @@ class BuildRunner extends CodeGenerator {
265
265
builder.target = flutterProject.manifest.appName;
266
266
}));
267
267
final String relativeMain = fs.path.relative (mainPath, from: flutterProject.directory.path);
268
- final File generatedPackagesFile = fs.file (fs.path.join (flutterProject.generated.path, fs.path.setExtension (relativeMain, '.packages' )));
269
268
final File generatedDillFile = fs.file (fs.path.join (flutterProject.generated.path, fs.path.setExtension (relativeMain, '.app.dill' )));
270
- return _BuildRunnerCodegenDaemon (buildDaemonClient, generatedPackagesFile, generatedDillFile);
269
+ return _BuildRunnerCodegenDaemon (buildDaemonClient, generatedDillFile);
270
+ }
271
+
272
+ // Create generated packages file which adds a multi-root scheme to the user's
273
+ // project directory. Currently we only replace the root package with a multiroot
274
+ // scheme. To support codegen on arbitrary packages we would need to do
275
+ // this for each dependency.
276
+ void _generatePackages (FlutterProject flutterProject) {
277
+ final String oldPackagesContents = fs.file (PackageMap .globalPackagesPath).readAsStringSync ();
278
+ final String appName = flutterProject.manifest.appName;
279
+ final String newPackagesContents = oldPackagesContents.replaceFirst ('$appName :lib/' , '$appName :$_kMultirootScheme :/' );
280
+ final String generatedPackagesPath = fs.path.setExtension (PackageMap .globalPackagesPath, '.generated' );
281
+ fs.file (generatedPackagesPath).writeAsStringSync (newPackagesContents);
271
282
}
272
283
}
273
284
274
285
class _BuildRunnerCodegenDaemon implements CodegenDaemon {
275
- _BuildRunnerCodegenDaemon (this .buildDaemonClient, this .packagesFile, this . dillFile);
286
+ _BuildRunnerCodegenDaemon (this .buildDaemonClient, this .dillFile);
276
287
277
288
final BuildDaemonClient buildDaemonClient;
278
289
@override
279
- final File packagesFile;
280
- @override
281
290
final File dillFile;
282
291
@override
283
292
CodegenStatus get lastStatus => _lastStatus;
0 commit comments