installAll method

Future<PackageInstallResult> installAll({
  1. required String projectPath,
  2. required List<DependencyConfig> dependencies,
  3. required List<DependencyConfig> devDependencies,
  4. String executable = 'flutter',
})

Installs dependencies and devDependencies sequentially into projectPath using flutter pub add, then runs a final flutter pub get.

Implementation

Future<PackageInstallResult> installAll({
  required String projectPath,
  required List<DependencyConfig> dependencies,
  required List<DependencyConfig> devDependencies,
  String executable = 'flutter',
}) async {
  final installedDeps = <String>[];
  final installedDevDeps = <String>[];

  // 1. Install regular dependencies sequentially
  for (final dep in dependencies) {
    final pkgSpec =
        dep.version != null ? '${dep.name}:${dep.version}' : dep.name;
    final result = await _runner.run(
      executable,
      ['pub', 'add', pkgSpec],
      workingDirectory: projectPath,
    );

    if (result.exitCode != 0) {
      final errText = result.stderr.toString().trim().isNotEmpty
          ? result.stderr.toString().trim()
          : result.stdout.toString().trim();
      throw PackageInstallException(
        packageName: dep.name,
        errorDetails: errText,
        installedBeforeFailure: List.unmodifiable(installedDeps),
        isDevDependency: false,
      );
    }

    installedDeps.add(dep.name);
  }

  // 2. Install dev dependencies sequentially
  for (final devDep in devDependencies) {
    final pkgSpec = devDep.version != null
        ? '${devDep.name}:${devDep.version}'
        : devDep.name;
    final result = await _runner.run(
      executable,
      ['pub', 'add', '--dev', pkgSpec],
      workingDirectory: projectPath,
    );

    if (result.exitCode != 0) {
      final errText = result.stderr.toString().trim().isNotEmpty
          ? result.stderr.toString().trim()
          : result.stdout.toString().trim();
      final allInstalled = [...installedDeps, ...installedDevDeps];
      throw PackageInstallException(
        packageName: devDep.name,
        errorDetails: errText,
        installedBeforeFailure: List.unmodifiable(allInstalled),
        isDevDependency: true,
      );
    }

    installedDevDeps.add(devDep.name);
  }

  // 3. Final explicit `flutter pub get`
  if (dependencies.isNotEmpty || devDependencies.isNotEmpty) {
    final getResult = await _runner.run(
      executable,
      ['pub', 'get'],
      workingDirectory: projectPath,
    );

    if (getResult.exitCode != 0) {
      throw FlutterCommandException(
        executable: executable,
        arguments: ['pub', 'get'],
        exitCode: getResult.exitCode,
        stdout: getResult.stdout.toString(),
        stderr: getResult.stderr.toString(),
      );
    }
  }

  return PackageInstallResult(
    installedDependencies: List.unmodifiable(installedDeps),
    installedDevDependencies: List.unmodifiable(installedDevDeps),
  );
}