projectPackagesFromDir function

Future<Set<String>> projectPackagesFromDir(
  1. String rootDir
)

The root package name plus every workspace/melos member package name found under rootDir.

Members are read from packages/*/pubspec.yaml under rootDir. Never throws: a missing rootDir, a missing pubspec.yaml, a pubspec with no name: line, or an unreadable packages/ directory (e.g. permission denied) are all treated as "no name to contribute" rather than an error, so a caller always gets a (possibly empty) result built from whatever could actually be read.

Implementation

Future<Set<String>> projectPackagesFromDir(String rootDir) async {
  final names = <String>{};

  final rootName = await _packageNameFromFile(_join(rootDir, 'pubspec.yaml'));
  if (rootName != null) names.add(rootName);

  final membersDir = Directory(_join(rootDir, 'packages'));
  if (await membersDir.exists()) {
    try {
      await for (final entry in membersDir.list()) {
        if (entry is! Directory) continue;
        final memberName = await _packageNameFromFile(
          _join(entry.path, 'pubspec.yaml'),
        );
        if (memberName != null) names.add(memberName);
      }
    } on Exception {
      // Unreadable packages/ dir (e.g. permission denied): degrade to
      // whatever was already gathered rather than throwing.
    }
  }

  return Set.unmodifiable(names);
}