resolvePackages static method

Future<PackageMap> resolvePackages({
  1. required String workspacePath,
  2. required List<Glob> packages,
  3. required List<Glob> ignore,
  4. required MelosLogger logger,
})

Implementation

static Future<PackageMap> resolvePackages({
  required String workspacePath,
  required List<Glob> packages,
  required List<Glob> ignore,
  required MelosLogger logger,
}) async {
  final pubspecFiles = await _resolvePubspecFiles(
    workspacePath: workspacePath,
    packages: packages,
    ignore: [
      ...ignore,
      for (final pattern in _commonIgnorePatterns)
        createGlob(pattern, currentDirectoryPath: workspacePath),
    ],
  );

  final packageMap = <String, Package>{};

  await Future.wait<void>(
    pubspecFiles.map((pubspecFile) async {
      final pubspecDirPath = pubspecFile.parent.path;
      final pubSpec = await PubSpec.load(pubspecFile.parent);

      final name = pubSpec.name!;

      if (packageMap.containsKey(name)) {
        throw MelosConfigException(
          '''
Multiple packages with the name `$name` found in the workspace, which is unsupported.
To fix this problem, consider renaming your packages to have a unique name.

The packages that caused the problem are:
- $name at ${printablePath(relativePath(pubspecDirPath, workspacePath))}
- $name at ${printablePath(relativePath(packageMap[name]!.path, workspacePath))}
''',
        );
      }

      packageMap[name] = Package(
        name: name,
        path: pubspecDirPath,
        pathRelativeToWorkspace: relativePath(pubspecDirPath, workspacePath),
        version: pubSpec.version ?? Version.none,
        publishTo: pubSpec.publishTo,
        packageMap: packageMap,
        dependencies: pubSpec.dependencies.keys.toList(),
        devDependencies: pubSpec.devDependencies.keys.toList(),
        dependencyOverrides: pubSpec.dependencyOverrides.keys.toList(),
        pubSpec: pubSpec,
      );
    }),
  );

  return PackageMap(packageMap, logger);
}