/// <summary> /// Analyzes a single Solution file for NuGet package references in referenced project files /// </summary> /// <param name="solutionFilePath"></param> /// <returns></returns> public async Task <HashSet <NugetPackage> > GetSolutionNugetPackages(string solutionFilePath, string baseIntermediateOutputPath, bool excludeTestProjects) { if (!_fileSystem.File.Exists(solutionFilePath)) { Console.Error.WriteLine($"Solution file \"{solutionFilePath}\" does not exist"); return(new HashSet <NugetPackage>()); } Console.WriteLine(); Console.WriteLine($"» Solution: {solutionFilePath}"); Console.WriteLine(" Getting projects"); var packages = new HashSet <NugetPackage>(); var projectPaths = await GetSolutionProjectReferencesAsync(solutionFilePath).ConfigureAwait(false); if (projectPaths.Count == 0) { Console.Error.WriteLine(" No projects found"); } else { Console.WriteLine($" {projectPaths.Count} project(s) found"); } // Process first all productive projects, then test projects (scope order) var projectQuery = from p in projectPaths orderby ProjectFileService.IsTestProject(p) select p; var directReferencePackages = new HashSet <NugetPackage>(); foreach (var projectFilePath in projectQuery) { Console.WriteLine(); var projectPackages = await _projectFileService.GetProjectNugetPackagesAsync(projectFilePath, baseIntermediateOutputPath, excludeTestProjects).ConfigureAwait(false); directReferencePackages.UnionWith(projectPackages.Where(p => p.IsDirectReference)); packages.UnionWith(projectPackages); } // Ensure packages which were discovered later are reflected as direct references in the final list. foreach (var directPackage in directReferencePackages) { packages.TryGetValue(directPackage, out var package); package.IsDirectReference = true; } return(packages); }
public SolutionFileService(IFileSystem fileSystem) { _fileSystem = fileSystem; _projectFileService = new ProjectFileService(_fileSystem); }