create helper classes
This commit is contained in:
24
DotNetSolutionTools.Core/Common/CsprojHelper.cs
Normal file
24
DotNetSolutionTools.Core/Common/CsprojHelper.cs
Normal file
@@ -0,0 +1,24 @@
|
||||
using Microsoft.Build.Construction;
|
||||
|
||||
namespace DotNetSolutionTools.Core.Common;
|
||||
|
||||
public static class CsprojHelper
|
||||
{
|
||||
public static string[] RetrieveAllCSharpProjectFullPathsFromFolder(string solutionFolderPath)
|
||||
{
|
||||
// if solutionFolderPath does not end with a slash, add one
|
||||
if (solutionFolderPath[^1] != Path.DirectorySeparatorChar)
|
||||
{
|
||||
solutionFolderPath += Path.DirectorySeparatorChar;
|
||||
}
|
||||
var csprojList = Directory.GetFiles(solutionFolderPath, "*.csproj", SearchOption.AllDirectories);
|
||||
return csprojList;
|
||||
}
|
||||
|
||||
public static string[] RetrieveAllCSharpProjectFullPathsFromSolution(SolutionFile solution)
|
||||
{
|
||||
var result = SlnHelper.GetCSharpProjectObjectsFromSolutionFile(solution);
|
||||
var csprojList = result.Select(x => x.FullPath).ToArray();
|
||||
return csprojList;
|
||||
}
|
||||
}
|
||||
23
DotNetSolutionTools.Core/Common/SlnHelper.cs
Normal file
23
DotNetSolutionTools.Core/Common/SlnHelper.cs
Normal file
@@ -0,0 +1,23 @@
|
||||
using Microsoft.Build.Construction;
|
||||
|
||||
namespace DotNetSolutionTools.Core.Common;
|
||||
|
||||
public static class SlnHelper
|
||||
{
|
||||
public static SolutionFile? ParseSolutionFileFromPath(string solutionFilePath)
|
||||
{
|
||||
var solutionFile = SolutionFile.Parse(solutionFilePath);
|
||||
|
||||
return solutionFile;
|
||||
}
|
||||
|
||||
public static List<ProjectRootElement> GetCSharpProjectObjectsFromSolutionFile(SolutionFile solutionFile)
|
||||
{
|
||||
var projectList = solutionFile
|
||||
.ProjectsByGuid.Where(x => x.Value.ProjectType == SolutionProjectType.KnownToBeMSBuildFormat)
|
||||
.Select(s => ProjectRootElement.Open(s.Value.AbsolutePath))
|
||||
.ToList();
|
||||
|
||||
return projectList;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using DotNetSolutionTools.Core.Infrastructure;
|
||||
using DotNetSolutionTools.Core.Common;
|
||||
using DotNetSolutionTools.Core.Infrastructure;
|
||||
using Microsoft.Build.Construction;
|
||||
using Microsoft.Build.Definition;
|
||||
using Microsoft.Build.Evaluation;
|
||||
@@ -11,7 +12,7 @@ public static class DotNetUpgrade
|
||||
public static async Task UpdateProjectsInSolutionToNet80(string solutionFilePath)
|
||||
{
|
||||
var solutionFile = SolutionFile.Parse(solutionFilePath);
|
||||
var csprojList = SolutionProjectParity.GetCSharpProjectObjectsFromSolutionFile(solutionFile);
|
||||
var csprojList = SlnHelper.GetCSharpProjectObjectsFromSolutionFile(solutionFile);
|
||||
await UpdateProjectsToNet80(csprojList);
|
||||
}
|
||||
|
||||
@@ -32,8 +33,7 @@ public static class DotNetUpgrade
|
||||
private static async Task UpdateProjectToNet80(ProjectRootElement project)
|
||||
{
|
||||
var targetFramework = project
|
||||
.PropertyGroups
|
||||
.SelectMany(x => x.Properties)
|
||||
.PropertyGroups.SelectMany(x => x.Properties)
|
||||
.FirstOrDefault(x => x.Name == "TargetFramework");
|
||||
if (targetFramework?.Value is "net8.0" or "net7.0" or "net6.0" or "net5.0")
|
||||
{
|
||||
@@ -57,27 +57,20 @@ public static class DotNetUpgrade
|
||||
new ProjectOptions() { LoadSettings = ProjectLoadSettings.IgnoreMissingImports }
|
||||
);
|
||||
var packages = evalProject
|
||||
.Items
|
||||
.Where(
|
||||
x =>
|
||||
x.ItemType == "PackageReference"
|
||||
&& x.HasMetadata("Version")
|
||||
&& x.EvaluatedInclude.StartsWith("Microsoft.")
|
||||
.Items.Where(x =>
|
||||
x.ItemType == "PackageReference"
|
||||
&& x.HasMetadata("Version")
|
||||
&& x.EvaluatedInclude.StartsWith("Microsoft.")
|
||||
)
|
||||
.ToList();
|
||||
|
||||
var packageNameAndVersion = packages
|
||||
.Select(
|
||||
x =>
|
||||
new
|
||||
{
|
||||
Package = x,
|
||||
Name = x.EvaluatedInclude,
|
||||
NugetVersion = NuGetVersion.Parse(
|
||||
x.Metadata.First(s => s.Name == "Version").UnevaluatedValue
|
||||
)
|
||||
}
|
||||
)
|
||||
.Select(x => new
|
||||
{
|
||||
Package = x,
|
||||
Name = x.EvaluatedInclude,
|
||||
NugetVersion = NuGetVersion.Parse(x.Metadata.First(s => s.Name == "Version").UnevaluatedValue)
|
||||
})
|
||||
.ToList();
|
||||
|
||||
var shouldSave = false;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Microsoft.Build.Construction;
|
||||
using DotNetSolutionTools.Core.Common;
|
||||
using Microsoft.Build.Construction;
|
||||
|
||||
namespace DotNetSolutionTools.Core;
|
||||
|
||||
@@ -7,27 +8,21 @@ public static class ImplicitUsings
|
||||
public static List<string> FindCSharpProjectsMissingImplicitUsings(string solutionFilePath)
|
||||
{
|
||||
var solutionFile = SolutionFile.Parse(solutionFilePath);
|
||||
var csprojList = SolutionProjectParity.GetCSharpProjectObjectsFromSolutionFile(
|
||||
solutionFile
|
||||
);
|
||||
var csprojList = SlnHelper.GetCSharpProjectObjectsFromSolutionFile(solutionFile);
|
||||
var projectsMissingImplicitUsings = FindCSharpProjectsMissingImplicitUsings(csprojList);
|
||||
var projectsMissingImplicitUsingsStringList = projectsMissingImplicitUsings
|
||||
.Select(x => x.FullPath)
|
||||
.ToList();
|
||||
var projectsMissingImplicitUsingsStringList = projectsMissingImplicitUsings.Select(x => x.FullPath).ToList();
|
||||
|
||||
return projectsMissingImplicitUsingsStringList;
|
||||
}
|
||||
|
||||
public static List<ProjectRootElement> FindCSharpProjectsMissingImplicitUsings(
|
||||
List<ProjectRootElement> projectList
|
||||
)
|
||||
public static List<ProjectRootElement> FindCSharpProjectsMissingImplicitUsings(List<ProjectRootElement> projectList)
|
||||
{
|
||||
var projectsMissingImplicitUsings = new List<ProjectRootElement>();
|
||||
|
||||
foreach (var project in projectList)
|
||||
{
|
||||
var implicitUsings = project.PropertyGroups
|
||||
.SelectMany(x => x.Properties)
|
||||
var implicitUsings = project
|
||||
.PropertyGroups.SelectMany(x => x.Properties)
|
||||
.FirstOrDefault(x => x.Name == "ImplicitUsings");
|
||||
if (implicitUsings is null || implicitUsings.Value is not "enable")
|
||||
{
|
||||
@@ -38,9 +33,7 @@ public static class ImplicitUsings
|
||||
return projectsMissingImplicitUsings;
|
||||
}
|
||||
|
||||
public static void AddMissingImplicitUsings(
|
||||
List<ProjectRootElement> projectsMissingImplicitUsings
|
||||
)
|
||||
public static void AddMissingImplicitUsings(List<ProjectRootElement> projectsMissingImplicitUsings)
|
||||
{
|
||||
foreach (var project in projectsMissingImplicitUsings)
|
||||
{
|
||||
@@ -53,24 +46,20 @@ public static class ImplicitUsings
|
||||
}
|
||||
}
|
||||
|
||||
public static void EnableDisabledImplicitUsings(
|
||||
List<ProjectRootElement> projectsMissingImplicitUsings
|
||||
)
|
||||
public static void EnableDisabledImplicitUsings(List<ProjectRootElement> projectsMissingImplicitUsings)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public static void EnableAllImplicitUsings(
|
||||
List<ProjectRootElement> projectsMissingImplicitUsings
|
||||
)
|
||||
public static void EnableAllImplicitUsings(List<ProjectRootElement> projectsMissingImplicitUsings)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public static bool ProjectIsMissingImplicitUsings(ProjectRootElement project)
|
||||
{
|
||||
var implicitUsings = project.PropertyGroups
|
||||
.SelectMany(x => x.Properties)
|
||||
var implicitUsings = project
|
||||
.PropertyGroups.SelectMany(x => x.Properties)
|
||||
.FirstOrDefault(x => x.Name == "ImplicitUsings");
|
||||
if (implicitUsings is null)
|
||||
{
|
||||
|
||||
@@ -1,69 +1,30 @@
|
||||
using Microsoft.Build.Construction;
|
||||
using DotNetSolutionTools.Core.Common;
|
||||
using Microsoft.Build.Construction;
|
||||
|
||||
namespace DotNetSolutionTools.Core;
|
||||
|
||||
public static class SolutionProjectParity
|
||||
{
|
||||
public static List<string> CompareSolutionAndCSharpProjects(
|
||||
string solutionFolderPath,
|
||||
string solutionFilePath
|
||||
)
|
||||
public static List<string> CompareSolutionAndCSharpProjects(string solutionFolderPath, string solutionFilePath)
|
||||
{
|
||||
var csprojList = RetrieveAllCSharpProjectNamesFromFolder(solutionFolderPath);
|
||||
var solutionFile = ParseSolutionFileFromPath(solutionFilePath);
|
||||
var csprojList = CsprojHelper.RetrieveAllCSharpProjectFullPathsFromFolder(solutionFolderPath);
|
||||
var solutionFile = SlnHelper.ParseSolutionFileFromPath(solutionFilePath);
|
||||
ArgumentNullException.ThrowIfNull(solutionFile);
|
||||
var projectsMissingFromSolution = FindProjectsMissingFromSolution(csprojList, solutionFile);
|
||||
|
||||
return projectsMissingFromSolution;
|
||||
}
|
||||
|
||||
public static string[] RetrieveAllCSharpProjectNamesFromFolder(string solutionFolderPath)
|
||||
{
|
||||
var csprojList = RetrieveAllCSharpProjectFullPathsFromFolder(solutionFolderPath);
|
||||
|
||||
return csprojList;
|
||||
}
|
||||
|
||||
public static string[] RetrieveAllCSharpProjectFullPathsFromFolder(string solutionFolderPath)
|
||||
{
|
||||
// if solutionFolderPath does not end with a slash, add one
|
||||
if (solutionFolderPath[^1] != Path.DirectorySeparatorChar)
|
||||
{
|
||||
solutionFolderPath += Path.DirectorySeparatorChar;
|
||||
}
|
||||
var csprojList = Directory.GetFiles(
|
||||
solutionFolderPath,
|
||||
"*.csproj",
|
||||
SearchOption.AllDirectories
|
||||
);
|
||||
return csprojList;
|
||||
}
|
||||
|
||||
public static string[] RetrieveAllCSharpProjectFullPathsFromSolution(SolutionFile solution)
|
||||
{
|
||||
var result = GetCSharpProjectObjectsFromSolutionFile(solution);
|
||||
var csprojList = result.Select(x => x.FullPath).ToArray();
|
||||
return csprojList;
|
||||
}
|
||||
|
||||
public static SolutionFile? ParseSolutionFileFromPath(string solutionFilePath)
|
||||
{
|
||||
var solutionFile = SolutionFile.Parse(solutionFilePath);
|
||||
|
||||
return solutionFile;
|
||||
}
|
||||
|
||||
public static List<string> FindProjectsMissingFromSolution(
|
||||
string[] csprojList,
|
||||
SolutionFile solutionFile
|
||||
)
|
||||
public static List<string> FindProjectsMissingFromSolution(string[] csprojList, SolutionFile solutionFile)
|
||||
{
|
||||
var projects = solutionFile.ProjectsInOrder;
|
||||
var projectsMissingFromSolution = new List<string>();
|
||||
|
||||
foreach (var project in csprojList)
|
||||
{
|
||||
var projectInSolution = projects.FirstOrDefault(x => NormalizePath(x.AbsolutePath) == NormalizePath(project));
|
||||
var projectInSolution = projects.FirstOrDefault(x =>
|
||||
NormalizePath(x.AbsolutePath) == NormalizePath(project)
|
||||
);
|
||||
|
||||
if (projectInSolution == null)
|
||||
{
|
||||
@@ -74,18 +35,6 @@ public static class SolutionProjectParity
|
||||
return projectsMissingFromSolution;
|
||||
}
|
||||
|
||||
public static List<ProjectRootElement> GetCSharpProjectObjectsFromSolutionFile(
|
||||
SolutionFile solutionFile
|
||||
)
|
||||
{
|
||||
var projectList = solutionFile.ProjectsByGuid
|
||||
.Where(x => x.Value.ProjectType == SolutionProjectType.KnownToBeMSBuildFormat)
|
||||
.Select(s => ProjectRootElement.Open(s.Value.AbsolutePath))
|
||||
.ToList();
|
||||
|
||||
return projectList;
|
||||
}
|
||||
|
||||
private static string NormalizePath(string path)
|
||||
{
|
||||
return Path.GetFullPath(new Uri(path).LocalPath)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Microsoft.Build.Construction;
|
||||
using DotNetSolutionTools.Core.Common;
|
||||
using Microsoft.Build.Construction;
|
||||
|
||||
namespace DotNetSolutionTools.Core;
|
||||
|
||||
@@ -7,7 +8,7 @@ public static class WarningsAsErrors
|
||||
public static List<string> FindCSharpProjectsMissingTreatWarningsAsErrors(string solutionFilePath)
|
||||
{
|
||||
var solutionFile = SolutionFile.Parse(solutionFilePath);
|
||||
var csprojList = SolutionProjectParity.GetCSharpProjectObjectsFromSolutionFile(solutionFile);
|
||||
var csprojList = SlnHelper.GetCSharpProjectObjectsFromSolutionFile(solutionFile);
|
||||
var projectsMissingImplicitUsings = FindCSharpProjectsMissingTreatWarningsAsErrors(csprojList);
|
||||
var projectsMissingImplicitUsingsStringList = projectsMissingImplicitUsings.Select(x => x.FullPath).ToList();
|
||||
|
||||
@@ -37,7 +38,7 @@ public static class WarningsAsErrors
|
||||
public static void AddMissingTreatWarningsAsErrorsToSolution(string solutionFilePath)
|
||||
{
|
||||
var solutionFile = SolutionFile.Parse(solutionFilePath);
|
||||
var csprojList = SolutionProjectParity.GetCSharpProjectObjectsFromSolutionFile(solutionFile);
|
||||
var csprojList = SlnHelper.GetCSharpProjectObjectsFromSolutionFile(solutionFile);
|
||||
var projectsMissingImplicitUsings = FindCSharpProjectsMissingTreatWarningsAsErrors(csprojList);
|
||||
AddMissingTreatWarningsAsErrors(projectsMissingImplicitUsings);
|
||||
}
|
||||
@@ -45,7 +46,7 @@ public static class WarningsAsErrors
|
||||
public static void RemoveAllTreatWarningsAsErrorsInSolution(string solutionFilePath)
|
||||
{
|
||||
var solutionFile = SolutionFile.Parse(solutionFilePath);
|
||||
var csprojList = SolutionProjectParity.GetCSharpProjectObjectsFromSolutionFile(solutionFile);
|
||||
var csprojList = SlnHelper.GetCSharpProjectObjectsFromSolutionFile(solutionFile);
|
||||
RemoveTreatWarningsAsErrors(csprojList);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user