private async Task <List <ReferencedProject> > GetReferencedProjectsFromProjectFileAsync() { /* * <ItemGroup> * <ProjectReference Include="..\BranchCoverage\Branch_Coverage.csproj" /> * <ProjectReference Include="..\FxClassLibrary1\FxClassLibrary1.csproj"></ProjectReference> * </ItemGroup> */ var xprojectReferences = ProjectFileXElement.XPathSelectElements($"/ItemGroup/ProjectReference[@Include]"); var requiresDesignTimeBuild = false; List <string> referencedProjectFiles = new List <string>(); foreach (var xprojectReference in xprojectReferences) { var referencedProjectProjectFile = xprojectReference.Attribute("Include").Value; if (referencedProjectProjectFile.Contains("$(")) { if (canUseMsBuildWorkspace) { requiresDesignTimeBuild = true; break; } else { logger.Log($"Cannot exclude referenced project {referencedProjectProjectFile} of {ProjectFile} with {ReferencedProject.excludeFromCodeCoveragePropertyName}. Cannot use MSBuildWorkspace"); } } else { if (!Path.IsPathRooted(referencedProjectProjectFile)) { referencedProjectProjectFile = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(ProjectFile), referencedProjectProjectFile)); } referencedProjectFiles.Add(referencedProjectProjectFile); } } if (requiresDesignTimeBuild) { var referencedProjects = await SafeGetReferencedProjectsWithDesignTimeBuildAsync(); return(referencedProjects); } return(referencedProjectFiles.Select(referencedProjectProjectFile => new ReferencedProject(referencedProjectProjectFile)).ToList()); }
public bool IsDotNetSdkStyle() { return(ProjectFileXElement .DescendantsAndSelf() .Where(x => { //https://docs.microsoft.com/en-us/visualstudio/msbuild/how-to-use-project-sdk?view=vs-2019 /* * <Project Sdk="My.Custom.Sdk"> * ... * </Project> * <Project Sdk="My.Custom.Sdk/1.2.3"> * ... * </Project> */ if ( x?.Name?.LocalName?.Equals("Project", StringComparison.OrdinalIgnoreCase) == true && x?.Parent == null ) { var sdkAttr = x?.Attributes()?.FirstOrDefault(attr => attr?.Name?.LocalName?.Equals("Sdk", StringComparison.OrdinalIgnoreCase) == true); if (sdkAttr?.Value?.Trim()?.StartsWith("Microsoft.NET.Sdk", StringComparison.OrdinalIgnoreCase) == true) { return true; } } /* * <Project> * <Sdk Name="My.Custom.Sdk" Version="1.2.3" /> * ... * </Project> */ if ( x?.Name?.LocalName?.Equals("Sdk", StringComparison.OrdinalIgnoreCase) == true && x?.Parent?.Name?.LocalName?.Equals("Project", StringComparison.OrdinalIgnoreCase) == true && x?.Parent?.Parent == null ) { var nameAttr = x?.Attributes()?.FirstOrDefault(attr => attr?.Name?.LocalName?.Equals("Name", StringComparison.OrdinalIgnoreCase) == true); if (nameAttr?.Value?.Trim()?.StartsWith("Microsoft.NET.Sdk", StringComparison.OrdinalIgnoreCase) == true) { return true; } } /* * <Project> * <PropertyGroup> * <MyProperty>Value</MyProperty> * </PropertyGroup> * <Import Project="Sdk.props" Sdk="My.Custom.Sdk" /> * ... * <Import Project="Sdk.targets" Sdk="My.Custom.Sdk" /> * </Project> */ if ( x?.Name?.LocalName?.Equals("Import", StringComparison.OrdinalIgnoreCase) == true && x?.Parent?.Name?.LocalName?.Equals("Project", StringComparison.OrdinalIgnoreCase) == true && x?.Parent?.Parent == null ) { var sdkAttr = x?.Attributes()?.FirstOrDefault(attr => attr?.Name?.LocalName?.Equals("Sdk", StringComparison.OrdinalIgnoreCase) == true); if (sdkAttr?.Value?.Trim()?.StartsWith("Microsoft.NET.Sdk", StringComparison.OrdinalIgnoreCase) == true) { return true; } } return false; }) .Any()); }