workspaceMemberPaths static method

List<String>? workspaceMemberPaths(
  1. String directory
)

The absolute member directories that the pubspec.yaml in directory lists under workspace, plus the directories its dpk.yaml workspace globs match. Returns null when neither file declares a workspace.

A dpk.yaml glob only matches directories whose pubspec.yaml has resolution: workspace, so a stray package or an example app is never pulled in by accident. Entries in pubspec.yaml are taken as written, because pub already treats them as members.

Implementation

static List<String>? workspaceMemberPaths(String directory) {
  final pubspecEntries = _stringList(
    _readYamlMap(p.join(directory, 'pubspec.yaml'))?['workspace'],
  );
  final dpkGlobs = _stringList(
    _readYamlMap(p.join(directory, 'dpk.yaml'))?['workspace'],
  );
  if (pubspecEntries == null && dpkGlobs == null) {
    return null;
  }

  final members = <String>[];
  void addMember(String path) {
    final normalized = p.normalize(path);
    if (!members.contains(normalized) && normalized != directory) {
      members.add(normalized);
    }
  }

  for (final entry in pubspecEntries ?? const <String>[]) {
    for (final path in expandPattern(entry, directory)) {
      if (File(p.join(path, 'pubspec.yaml')).existsSync()) {
        addMember(path);
      }
    }
  }
  for (final glob in dpkGlobs ?? const <String>[]) {
    for (final path in expandPattern(glob, directory)) {
      final package = WorkspacePackage.read(path, root: directory);
      if (package != null && package.isWorkspaceMember) {
        addMember(path);
      }
    }
  }
  return members;
}