build function
Compile changed RSP files. This method shall be called within build.dart,
with the arguments passed to main()
as its arguments
.
Notice that it accepts files ending with .rsp.whatever
.
filenameMapper
- returns the filename of the destination file, which must end with.dart
. If omitted, it will be generated under thewebapp
folder with the same path structure.imports
- additional imported packages, such as["package:foo/foo.dart"]
.
Implementation
Future build(List<String> arguments, {String filenameMapper(String source)?,
Encoding encoding = utf8, List<String>? imports}) async {
final ArgParser argParser = ArgParser()
..addMultiOption("changed")
..addMultiOption("removed")
..addFlag("clean", negatable: false)
..addFlag("machine", negatable: false)
..addFlag("full", negatable: false);
final args = argParser.parse(arguments),
changed = args["changed"] as List<String>,
removed = args["removed"] as List<String>,
clean = args["clean"] as bool;
if (clean) { // clean only
Directory.current.list(recursive: true).listen((fse) {
if (fse is File && fse.path.endsWith(".rsp.dart"))
fse.delete();
});
} else if (removed.isEmpty && changed.isEmpty) { // full build
Directory.current.list(recursive: true).listen((fse) {
if (fse is File && _rspSource(fse.path) >= 0)
compileFile(fse.path, encoding: encoding,
destinationName: filenameMapper != null ? filenameMapper(fse.path): null,
imports: imports);
});
} else {
for (String name in removed) {
final i = _rspSource(name);
if (i >= 0) {
final File gen = File("${name.substring(0, i)}dart");
if (await gen.exists())
gen.delete();
}
}
for (String name in changed) {
if (_rspSource(name) >= 0)
compileFile(name, encoding: encoding,
destinationName: filenameMapper != null ? filenameMapper(name): null,
imports: imports);
}
}
}