Ejemplo n.º 1
0
        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());
        }
Ejemplo n.º 2
0
        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());
        }