public Converter(UnconfiguredProject project, BaselineProject sdkBaselineProject, IProjectRootElement projectRootElement) { _project = project ?? throw new ArgumentNullException(nameof(project)); _sdkBaselineProject = sdkBaselineProject; _projectRootElement = projectRootElement ?? throw new ArgumentNullException(nameof(projectRootElement)); _differs = GetDiffers(); }
static string GetBestTFM(BaselineProject baselineProject, bool keepCurrentTfm, string?specifiedTFM, bool usePreviewSDK) { if (string.IsNullOrWhiteSpace(specifiedTFM)) { // Let's figure this out, friends var tfmForApps = TargetFrameworkHelper.FindHighestInstalledTargetFramework(usePreviewSDK); if (keepCurrentTfm) { specifiedTFM = baselineProject.GetTfm(); } else if (baselineProject.ProjectStyle == ProjectStyle.WindowsDesktop || baselineProject.ProjectStyle == ProjectStyle.MSTest) { specifiedTFM = tfmForApps; } else if (baselineProject.OutputType == ProjectOutputType.Library) { specifiedTFM = MSBuildFacts.Netstandard20; } else if (baselineProject.OutputType == ProjectOutputType.Exe) { specifiedTFM = tfmForApps; } else { // Default is to just use what exists in the project specifiedTFM = baselineProject.GetTfm(); } } return(specifiedTFM); }
public Converter(UnconfiguredProject project, BaselineProject sdkBaselineProject, IProjectRootElement projectRootElement, bool noBackup, bool forceRemoveCustomImports) { _project = project ?? throw new ArgumentNullException(nameof(project)); _sdkBaselineProject = sdkBaselineProject; _projectRootElement = projectRootElement ?? throw new ArgumentNullException(nameof(projectRootElement)); _noBackup = noBackup; _forceRemoveCustomImports = forceRemoveCustomImports; _differs = GetDiffers(); }
public async Task <BaselineArtifacts> SetupBaseline(EnC.EditAndContinueCapabilities capabilities, CancellationToken ct = default) { InitMSBuild(); BaselineProject baselineProject = await Microsoft.DotNet.HotReload.Utils.Generator.BaselineProject.Make(config, capabilities, ct); var baselineArtifacts = await baselineProject.PrepareBaseline(ct); Console.WriteLine("baseline ready"); return(baselineArtifacts); }
public MSBuildConversionWorkspaceItem(IProjectRootElement root, UnconfiguredProject unconfiguredProject, BaselineProject baseline) { ProjectRootElement = root; UnconfiguredProject = unconfiguredProject; SdkBaselineProject = baseline; }
public static IProjectRootElement RemoveDefaultedProperties(this IProjectRootElement projectRootElement, BaselineProject baselineProject, ImmutableDictionary <string, Differ> differs) { foreach (var propGroup in projectRootElement.PropertyGroups) { var configurationName = MSBuildHelpers.GetConfigurationName(propGroup.Condition); var propDiff = differs[configurationName].GetPropertiesDiff(); foreach (var prop in propGroup.Properties) { // These properties were added to the baseline - so don't treat them as defaulted properties. if (baselineProject.GlobalProperties.Contains(prop.Name, StringComparer.OrdinalIgnoreCase)) { continue; } if (propDiff.DefaultedProperties.Select(p => p.Name).Contains(prop.Name, StringComparer.OrdinalIgnoreCase)) { propGroup.RemoveChild(prop); } } if (propGroup.Properties.Count == 0) { projectRootElement.RemoveChild(propGroup); } } return(projectRootElement); }
public static IProjectRootElement UpdateOutputTypeProperty(this IProjectRootElement projectRootElement, BaselineProject baselineProject) { var outputTypeNode = projectRootElement.GetOutputTypeNode(); if (outputTypeNode != null) { outputTypeNode.Value = baselineProject.OutputType switch { ProjectOutputType.Exe => MSBuildFacts.ExeOutputType, ProjectOutputType.Library => MSBuildFacts.LibraryOutputType, ProjectOutputType.WinExe => MSBuildFacts.WinExeOutputType, _ => throw new InvalidOperationException("Unsupported output type: " + baselineProject.OutputType) }; } return(projectRootElement); }
public static IProjectRootElement ChangeImportsAndAddSdkAttribute(this IProjectRootElement projectRootElement, BaselineProject baselineProject) { foreach (var import in projectRootElement.Imports) { projectRootElement.RemoveChild(import); } if (baselineProject.ProjectStyle is ProjectStyle.WindowsDesktop && baselineProject.TargetTFM is MSBuildFacts.NetCoreApp31) { projectRootElement.Sdk = DesktopFacts.WinSDKAttribute; } else if (MSBuildHelpers.IsWeb(projectRootElement)) { projectRootElement.Sdk = WebFacts.WebSDKAttribute; } else { projectRootElement.Sdk = MSBuildFacts.DefaultSDKAttribute; } return(projectRootElement); }
public static IProjectRootElement ChangeImports(this IProjectRootElement projectRootElement, BaselineProject baselineProject) { switch (baselineProject.ProjectStyle) { case ProjectStyle.Default: case ProjectStyle.DefaultSubset: case ProjectStyle.WindowsDesktop: case ProjectStyle.MSTest: foreach (var import in projectRootElement.Imports) { projectRootElement.RemoveChild(import); } projectRootElement.Sdk = MSBuildHelpers.IsWinForms(projectRootElement) || MSBuildHelpers.IsWPF(projectRootElement) || MSBuildHelpers.IsDesktop(projectRootElement) ? DesktopFacts.WinSDKAttribute : MSBuildFacts.DefaultSDKAttribute; break; } return(projectRootElement); }
public static IProjectRootElement ChangeImportsAndAddSdkAttribute(this IProjectRootElement projectRootElement, BaselineProject baselineProject, bool forceRemoveCustomImports) { foreach (var import in projectRootElement.Imports) { if (!forceRemoveCustomImports) { var fileName = Path.GetFileName(import.Project); if (MSBuildFacts.PropsToRemove.Contains(fileName, StringComparer.OrdinalIgnoreCase) || MSBuildFacts.TargetsToRemove.Contains(fileName, StringComparer.OrdinalIgnoreCase)) { projectRootElement.RemoveChild(import); } else if (!MSBuildFacts.ImportsToKeep.Contains(fileName, StringComparer.OrdinalIgnoreCase)) { Console.WriteLine($"This project has an unrecognized custom import which may need reviewed after conversion: {fileName}"); } } else { projectRootElement.RemoveChild(import); } } if (baselineProject.ProjectStyle is ProjectStyle.WindowsDesktop && baselineProject.TargetTFM is MSBuildFacts.NetCoreApp31) { projectRootElement.Sdk = DesktopFacts.WinSDKAttribute; } else if (MSBuildHelpers.IsAspNetCore(projectRootElement, baselineProject.TargetTFM)) { // Libraries targeting .NET Framework can use the default SDK and still be used by NetFx callers. // However, web apps (as opposed to libraries) or libraries that are targeting .NET Core/.NET should use the web SDK. projectRootElement.Sdk = WebFacts.WebSDKAttribute; } else { projectRootElement.Sdk = MSBuildFacts.DefaultSDKAttribute; } // Xamarin projects contain the Import line, not needed for .NET MAUI if ((baselineProject.ProjectStyle is ProjectStyle.XamarinDroid) || (baselineProject.ProjectStyle is ProjectStyle.XamariniOS)) { foreach (var import in projectRootElement.Imports) { if (XamarinFacts.UnnecessaryXamarinImports.Contains(import.Project, StringComparer.OrdinalIgnoreCase)) { projectRootElement.RemoveChild(import); } } } return(projectRootElement); }
public static IProjectRootElement ChangeImports(this IProjectRootElement projectRootElement, BaselineProject baselineProject) { var projectStyle = baselineProject.ProjectStyle; if (projectStyle == ProjectStyle.Default || projectStyle == ProjectStyle.DefaultSubset || projectStyle == ProjectStyle.WindowsDesktop) { foreach (var import in projectRootElement.Imports) { projectRootElement.RemoveChild(import); } if (MSBuildHelpers.IsWinForms(projectRootElement) || MSBuildHelpers.IsWPF(projectRootElement) || MSBuildHelpers.IsDesktop(projectRootElement)) { projectRootElement.Sdk = DesktopFacts.WinSDKAttribute; } else { projectRootElement.Sdk = MSBuildFacts.DefaultSDKAttribute; } } return(projectRootElement); }
public static IProjectRootElement ChangeImportsAndAddSdkAttribute(this IProjectRootElement projectRootElement, BaselineProject baselineProject) { foreach (var import in projectRootElement.Imports) { var fileName = Path.GetFileName(import.Project); if (MSBuildFacts.PropsToRemove.Contains(fileName, StringComparer.OrdinalIgnoreCase) || MSBuildFacts.TargetsToRemove.Contains(fileName, StringComparer.OrdinalIgnoreCase)) { projectRootElement.RemoveChild(import); } else if (!MSBuildFacts.ImportsToKeep.Contains(fileName, StringComparer.OrdinalIgnoreCase)) { Console.WriteLine($"This project has an unrecognized custom import which may need reviewed after conversion: {fileName}"); } } if (baselineProject.ProjectStyle is ProjectStyle.WindowsDesktop && baselineProject.TargetTFM is MSBuildFacts.NetCoreApp31) { projectRootElement.Sdk = DesktopFacts.WinSDKAttribute; } else if (MSBuildHelpers.IsWeb(projectRootElement)) { projectRootElement.Sdk = WebFacts.WebSDKAttribute; } else { projectRootElement.Sdk = MSBuildFacts.DefaultSDKAttribute; } return(projectRootElement); }
public static IProjectRootElement AddCsWinRTReferenceAndComponentProperty(this IProjectRootElement projectRootElement, BaselineProject baselineProject) { if (baselineProject.OutputType == ProjectOutputType.WinMdObj) { var topLevelPropGroup = MSBuildHelpers.GetOrCreateTopLevelPropertyGroup(baselineProject, projectRootElement); topLevelPropGroup.AddProperty(MSBuildFacts.CsWinRTComponentName, "true"); var packageReferenceItemGroup = projectRootElement.ItemGroups.Where(ig => ig.Items.Any(i => i.ItemType == MSBuildFacts.MSBuildPackageReferenceName)) .FirstOrDefault() ?? projectRootElement.AddItemGroup(); AddPackageReferenceElement(packageReferenceItemGroup, MSBuildFacts.CsWinRTPackageReference.Name, MSBuildFacts.CsWinRTPackageReference.Version); } return(projectRootElement); }