workspaceMemberPaths static method
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;
}