diff --git a/tools/BuildGraph/Project.cs b/tools/BuildGraph/Project.cs index 12d3da6fb4edbcf09e2217f9a6845ae4608b5960..af8761e829228953cb00f4eefc3ce12d813cb974 100644 --- a/tools/BuildGraph/Project.cs +++ b/tools/BuildGraph/Project.cs @@ -14,8 +14,10 @@ namespace BuildGraph public string Name { get; } + public string Path { get; set; } + public Repository Repository { get; set; } - public IList<string> PackageReferences { get; set; } = Array.Empty<string>(); + public ISet<string> PackageReferences { get; } = new HashSet<string>(StringComparer.OrdinalIgnoreCase); } } \ No newline at end of file diff --git a/tools/BuildGraph/Repository.cs b/tools/BuildGraph/Repository.cs index 821ffc54c08f710f1cd86f4a7a114a0412009c64..e8893d7ff87805d4d8ddacb80cee0704a7843a90 100644 --- a/tools/BuildGraph/Repository.cs +++ b/tools/BuildGraph/Repository.cs @@ -61,37 +61,41 @@ namespace BuildGraph var srcDirectory = Path.Combine(repositoryPath, "src"); var solutionFiles = Directory.EnumerateFiles(repositoryPath, "*.sln"); - var knownProjects = new HashSet<string>(StringComparer.OrdinalIgnoreCase); foreach (var file in solutionFiles) { var spec = provider.GetDependencyGraphSpec(name, file); - foreach (var specProject in spec.Projects) + var projects = spec.Projects.OrderBy(p => p.RestoreMetadata.ProjectStyle == ProjectStyle.PackageReference ? 0 : 1); + foreach (var specProject in projects) { - if (!knownProjects.Add(specProject.FilePath) || - specProject.RestoreMetadata.ProjectStyle != ProjectStyle.PackageReference) - { - continue; - } - var projectPath = Path.GetFullPath(specProject.FilePath); - var project = new Project(specProject.Name) - { - PackageReferences = GetPackageReferences(specProject), - Repository = repository, - }; - var projectGroup = projectPath.StartsWith(srcDirectory, StringComparison.OrdinalIgnoreCase) ? repository.Projects : repository.SupportProjects; - projectGroup.Add(project); + + var project = projectGroup.FirstOrDefault(f => f.Path == specProject.FilePath); + if (project == null) + { + project = new Project(specProject.Name) + { + Repository = repository, + Path = specProject.FilePath, + }; + + projectGroup.Add(project); + } + + foreach (var package in GetPackageReferences(specProject)) + { + project.PackageReferences.Add(package); + } } } return repository; } - private static List<string> GetPackageReferences(NuGet.ProjectModel.PackageSpec specProject) + private static List<string> GetPackageReferences(PackageSpec specProject) { var allDependencies = Enumerable.Concat( specProject.Dependencies,