public static LogKeyValueItem ScaffoldProjFile( FileInfo projectCsProjFile, bool createAsWeb, bool createAsTestProject, string projectName, bool useNullableReferenceTypes, List<string>? frameworkReferences, List<Tuple<string, string, string?>>? packageReferences, List<FileInfo>? projectReferences, bool includeApiSpecification) { if (projectCsProjFile == null) { throw new ArgumentNullException(nameof(projectCsProjFile)); } var sb = new StringBuilder(); sb.AppendLine(createAsWeb ? "<Project Sdk=\"Microsoft.NET.Sdk.Web\">" : "<Project Sdk=\"Microsoft.NET.Sdk\">"); sb.AppendLine(); sb.AppendLine(2, "<PropertyGroup>"); sb.AppendLine(4, "<TargetFramework>netcoreapp3.1</TargetFramework>"); if (!createAsTestProject) { sb.AppendLine(4, "<IsPackable>false</IsPackable>"); } sb.AppendLine(2, "</PropertyGroup>"); sb.AppendLine(); if (!createAsTestProject) { sb.AppendLine(2, "<PropertyGroup>"); if (useNullableReferenceTypes) { sb.AppendLine(4, "<Nullable>enable</Nullable>"); } sb.AppendLine(4, "<LangVersion>8.0</LangVersion>"); sb.AppendLine(2, "</PropertyGroup>"); sb.AppendLine(); sb.AppendLine(2, "<PropertyGroup>"); sb.AppendLine(4, "<GenerateDocumentationFile>true</GenerateDocumentationFile>"); sb.AppendLine(2, "</PropertyGroup>"); sb.AppendLine(); sb.AppendLine(2, "<PropertyGroup>"); sb.AppendLine(4, $"<DocumentationFile>bin\\Debug\\netcoreapp3.1\\{projectName}.xml</DocumentationFile>"); sb.AppendLine(4, "<NoWarn>1573;1591;1701;1702;1712;8618</NoWarn>"); sb.AppendLine(2, "</PropertyGroup>"); sb.AppendLine(); if (includeApiSpecification) { sb.AppendLine(2, "<ItemGroup>"); sb.AppendLine(4, "<None Remove=\"Resources\\ApiSpecification.yaml\" />"); sb.AppendLine(4, "<EmbeddedResource Include=\"Resources\\ApiSpecification.yaml\" />"); sb.AppendLine(2, "</ItemGroup>"); sb.AppendLine(); } } if (frameworkReferences != null && frameworkReferences.Count > 0) { sb.AppendLine(2, "<ItemGroup>"); foreach (var frameworkReference in frameworkReferences.OrderBy(x => x)) { sb.AppendLine(4, $"<FrameworkReference Include=\"{frameworkReference}\" />"); } sb.AppendLine(2, "</ItemGroup>"); sb.AppendLine(); } if (packageReferences != null && packageReferences.Count > 0) { sb.AppendLine(2, "<ItemGroup>"); foreach (var (package, version, extra) in packageReferences.OrderBy(x => x.Item1)) { if (extra == null) { sb.AppendLine(4, $"<PackageReference Include=\"{package}\" Version=\"{version}\" />"); } else { sb.AppendLine(4, $"<PackageReference Include=\"{package}\" Version=\"{version}\">"); var sa = extra.Split('\n'); foreach (var s in sa) { sb.AppendLine(6, $"{s}"); } sb.AppendLine(4, "</PackageReference>"); } } sb.AppendLine(2, "</ItemGroup>"); sb.AppendLine(); } if (projectReferences != null && projectReferences.Count > 0) { sb.AppendLine(2, "<ItemGroup>"); foreach (var projectReference in projectReferences.OrderBy(x => x.Name)) { var packageReferenceValue = GetProjectReference(projectCsProjFile, projectReference); sb.AppendLine(4, $"<ProjectReference Include=\"{packageReferenceValue}\" />"); } sb.AppendLine(2, "</ItemGroup>"); sb.AppendLine(); } sb.AppendLine("</Project>"); return TextFileHelper.Save(projectCsProjFile, sb.ToString()); }
public static List<LogKeyValueItem> ScaffoldSlnFile( FileInfo slnFile, string projectName, DirectoryInfo apiPath, DirectoryInfo domainPath, DirectoryInfo hostPath, DirectoryInfo? apiTestPath = null, DirectoryInfo? domainTestPath = null, DirectoryInfo? hostTestPath = null) { if (slnFile == null) { throw new ArgumentNullException(nameof(slnFile)); } if (apiPath == null) { throw new ArgumentNullException(nameof(apiPath)); } if (domainPath == null) { throw new ArgumentNullException(nameof(domainPath)); } if (hostPath == null) { throw new ArgumentNullException(nameof(hostPath)); } var slnId = Guid.NewGuid(); var apiId = Guid.NewGuid(); var domainId = Guid.NewGuid(); var hostId = Guid.NewGuid(); var apiTestId = Guid.NewGuid(); var domainTestId = Guid.NewGuid(); var hostTestId = Guid.NewGuid(); var apiPrefixPath = GetProjectReference(slnFile, apiPath, projectName); var domainPrefixPath = GetProjectReference(slnFile, domainPath, projectName); var hostPrefixPath = GetProjectReference(slnFile, hostPath, projectName); var codeInspectionExcludeProjects = new List<Guid>(); var codeInspectionExcludeProjectsFolders = new List<Tuple<Guid, DirectoryInfo, List<DirectoryInfo>>>(); if (slnFile.Exists) { var lines = File.ReadAllLines(slnFile.FullName); if (TryGetGuidByProject(lines, "Api.Generated.csproj", out Guid idApiGenerated)) { codeInspectionExcludeProjects.Add(idApiGenerated); } if (TryGetGuidByProject(lines, "Api.Generated.Tests.csproj", out Guid idApiGeneratedTest)) { codeInspectionExcludeProjects.Add(idApiGeneratedTest); } if (hostTestPath != null && TryGetGuidByProject(lines, "Api.Tests.csproj", out Guid idHostTest)) { var hostTestDirectory = new DirectoryInfo(hostTestPath.FullName + ".Tests"); var generatedDirectories = hostTestDirectory.GetDirectories("Generated", SearchOption.AllDirectories).ToList(); codeInspectionExcludeProjectsFolders.Add(new Tuple<Guid, DirectoryInfo, List<DirectoryInfo>>(idHostTest, hostTestDirectory, generatedDirectories)); } if (domainTestPath != null && TryGetGuidByProject(lines, "Domain.Tests.csproj", out Guid idDomainTest)) { var domainTestDirectory = new DirectoryInfo(domainTestPath.FullName + ".Tests"); var generatedDirectories = domainTestDirectory.GetDirectories("Generated", SearchOption.AllDirectories).ToList(); codeInspectionExcludeProjectsFolders.Add(new Tuple<Guid, DirectoryInfo, List<DirectoryInfo>>(idDomainTest, domainTestDirectory, generatedDirectories)); } } else { codeInspectionExcludeProjects.Add(apiId); if (apiTestPath != null) { codeInspectionExcludeProjects.Add(apiTestId); } if (hostTestPath != null) { var hostTestDirectory = new DirectoryInfo(hostTestPath.FullName + ".Tests"); var generatedDirectories = hostTestDirectory.GetDirectories("Generated", SearchOption.AllDirectories).ToList(); codeInspectionExcludeProjectsFolders.Add(new Tuple<Guid, DirectoryInfo, List<DirectoryInfo>>(hostTestId, hostTestDirectory, generatedDirectories)); } if (domainTestPath != null) { var domainTestDirectory = new DirectoryInfo(domainTestPath.FullName + ".Tests"); var generatedDirectories = domainTestDirectory.GetDirectories("Generated", SearchOption.AllDirectories).ToList(); codeInspectionExcludeProjectsFolders.Add(new Tuple<Guid, DirectoryInfo, List<DirectoryInfo>>(domainTestId, domainTestDirectory, generatedDirectories)); } } var slnFileContent = CreateSlnFileContent( slnFile, projectName, apiTestPath, domainTestPath, hostTestPath, apiPrefixPath, apiId, domainPrefixPath, domainId, hostPrefixPath, hostId, hostTestId, apiTestId, domainTestId, slnId); var slnDotSettingsFile = new FileInfo(slnFile + ".DotSettings"); var slnDotSettingsFileContent = CreateSlnDotSettingsFileContent( codeInspectionExcludeProjects, codeInspectionExcludeProjectsFolders); bool slnDotSettingsFileOverrideIfExist = true; if (slnDotSettingsFile.Exists) { var lines = File.ReadAllLines(slnDotSettingsFile.FullName); if (lines.Any(line => !line.Contains("ResourceDictionary", StringComparison.Ordinal) && !line.Contains("/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2", StringComparison.Ordinal))) { slnDotSettingsFileOverrideIfExist = false; } } var logItems = new List<LogKeyValueItem> { TextFileHelper.Save(slnFile, slnFileContent, false), TextFileHelper.Save(slnDotSettingsFile, slnDotSettingsFileContent, slnDotSettingsFileOverrideIfExist), }; return logItems; }