runInit function
Entry point for river_cli init. Resolves the selected modules (via flags
or interactive prompts), scaffolds their folders/files, and adds packages.
Implementation
void runInit(InitOptions options) {
if (options.help) {
printInitHelp();
return;
}
if (options.list) {
printModuleList();
return;
}
if (!File('pubspec.yaml').existsSync()) {
print('Error: pubspec.yaml not found. '
'Run "river_cli init" in the root of a Flutter project.');
exit(1);
}
final projectName = Utils.readPackageName();
if (projectName != null) {
print('Initializing project: $projectName\n');
}
if (options.unknownFlags.isNotEmpty) {
print('Ignoring unknown option(s): ${options.unknownFlags.join(', ')}');
}
final selectedKeys = _resolveSelectedKeys(options);
final modules = resolveModules(selectedKeys);
final autoIncluded = modules
.where((m) => m.key != coreModule.key && !selectedKeys.contains(m.key))
.map((m) => m.key)
.toList();
if (autoIncluded.isNotEmpty) {
print('Auto-including required dependencies: ${autoIncluded.join(', ')}');
}
final created = <String>[];
final skipped = <String>[];
final overwritten = <String>[];
for (final module in modules) {
for (final folder in module.folders) {
final dir = Directory(folder);
if (!dir.existsSync()) dir.createSync(recursive: true);
}
module.files.forEach((path, content) {
final file = File(path);
final exists = file.existsSync();
if (exists && !options.force) {
skipped.add(path);
return;
}
file.parent.createSync(recursive: true);
file.writeAsStringSync(_normalize(content));
(exists ? overwritten : created).add(path);
});
}
final deps = <String>{};
final devDeps = <String>{};
for (final module in modules) {
deps.addAll(module.packages);
devDeps.addAll(module.devPackages);
}
print('');
Utils.addModulePackages(
deps.toList(),
devDeps.toList(),
runPubGet: options.runPubGet,
);
_printSummary(
modules: modules,
created: created,
overwritten: overwritten,
skipped: skipped,
);
}