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.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; } return(projectRootElement); }
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 void RegisterInstance() { if (Interlocked.Exchange(ref _registered, 1) == 0) { MSBuildHelpers.HookAssemblyResolveForMSBuild(); } }
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 void ConvertsWinformsFrameworkTemplate() { MSBuildHelpers.HookAssemblyResolveForMSBuild(@"C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\MSBuild\Current\Bin"); var projectToConvertPath = Path.Combine("..", "..", "..", "..", "..", "tests", "TestData", "SmokeTests.WinformsFramework", "SmokeTests.WinformsFramework.csproj"); var projectBaselinePath = Path.Combine("..", "..", "..", "..", "..", "tests", "TestData", "SmokeTests.WinformsCoreBaseline", "SmokeTests.WinformsCoreBaseline.csproj"); AssertConversionWorks(projectToConvertPath, projectBaselinePath); }
public void ConvertsLegacyFSharpConsole() { MSBuildHelpers.HookAssemblyResolveForMSBuild(@"C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\MSBuild\Current\Bin"); var projectToConvertPath = Path.Combine("..", "..", "..", "..", "..", "tests", "TestData", "SmokeTests.LegacyFSharpConsole", "SmokeTests.LegacyFSharpConsole.fsproj"); var projectBaselinePath = Path.Combine("..", "..", "..", "..", "..", "tests", "TestData", "SmokeTests.FSharpConsoleBaseline", "SmokeTests.FSharpConsoleBaseline.fsproj"); AssertConversionWorks(projectToConvertPath, projectBaselinePath); }
public void RegisterInstance() { if (Interlocked.Exchange(ref _registered, 1) == 0) { // During testing we just need a default MSBuild instance to be registered. var defaultInstance = MSBuildLocator.QueryVisualStudioInstances().First(); MSBuildHelpers.HookAssemblyResolveForMSBuild(defaultInstance.MSBuildPath); } }
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); }
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) { 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 void MSBuildPathForXamarinProject() { if (Interlocked.Exchange(ref _registered, 1) == 0) { // During testing we just need a default MSBuild instance to be registered. var defaultInstance = MSBuildLocator.QueryVisualStudioInstances().First(); MSBuildHelpers.HookAssemblyResolveForMSBuild(defaultInstance.MSBuildPath); // For Xamarin support we need to set the MSBuild Extensions path to VS install. var vsinstalldir = !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("VSINSTALLDIR")) ? Environment.GetEnvironmentVariable("VSINSTALLDIR") : new VisualStudioLocator().GetLatestVisualStudioPath(); if (!string.IsNullOrEmpty(vsinstalldir)) { Environment.SetEnvironmentVariable("MSBuildExtensionsPath", Path.Combine(vsinstalldir, "MSBuild")); } else { Console.WriteLine("Error locating VS Install Directory. Try setting Environment Variable VSINSTALLDIR."); } } }
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 void MSBuildPathForXamarinProject() { if (Interlocked.Exchange(ref _registered, 1) == 0) { //For Xamarin Project tests, default MSBuild instance resolved from VSINSTALLDIR Environment Variable var vsinstalldir = Environment.GetEnvironmentVariable("VSINSTALLDIR"); if (!string.IsNullOrEmpty(vsinstalldir)) { MSBuildHelpers.HookAssemblyResolveForMSBuild(Path.Combine(vsinstalldir, "MSBuild", "Current", "Bin")); } else { string vsPath = new VisualStudioLocator().GetLatestVisualStudioPath(); if (string.IsNullOrWhiteSpace(vsPath)) { throw new Exception("Error locating VS Install Directory. Try setting Environment Variable VSINSTALLDIR."); } else { MSBuildHelpers.HookAssemblyResolveForMSBuild(Path.Combine(vsPath, "MSBuild", "Current", "Bin")); } } } }
public static int Run(string?project, string?workspace, string?msbuildPath, string?tfm, bool allowPreviews, bool diffOnly, bool noBackup, bool keepCurrentTfms) { if (!string.IsNullOrWhiteSpace(project) && !string.IsNullOrWhiteSpace(workspace)) { Console.WriteLine("Cannot specify both a project and a workspace."); return(-1); } if (!string.IsNullOrWhiteSpace(tfm) && keepCurrentTfms) { Console.WriteLine($"Both '{nameof(tfm)}' and '{nameof(keepCurrentTfms)}' cannot be specified. Please pick one."); return(-1); } try { msbuildPath = MSBuildHelpers.HookAssemblyResolveForMSBuild(msbuildPath); if (string.IsNullOrWhiteSpace(msbuildPath)) { Console.WriteLine("Could not find an MSBuild."); return(-1); } if (!string.IsNullOrWhiteSpace(tfm)) { tfm = tfm.Trim(); if (!TargetFrameworkHelper.IsValidTargetFramework(tfm)) { Console.WriteLine($"Invalid framework specified for --target-framework: '{tfm}'"); return(-1); } } var workspacePath = string.Empty; MSBuildConversionWorkspaceType workspaceType; if (!string.IsNullOrWhiteSpace(project)) { workspacePath = Path.GetFullPath(project, Environment.CurrentDirectory); workspaceType = MSBuildConversionWorkspaceType.Project; } else { var(isSolution, workspaceFilePath) = MSBuildConversionWorkspaceFinder.FindWorkspace(Environment.CurrentDirectory, workspace); workspaceType = isSolution ? MSBuildConversionWorkspaceType.Solution : MSBuildConversionWorkspaceType.Project; workspacePath = workspaceFilePath; } var workspaceLoader = new MSBuildConversionWorkspaceLoader(workspacePath, workspaceType); // do not create backup if --diff-only specified noBackup = noBackup || diffOnly; var msbuildWorkspace = workspaceLoader.LoadWorkspace(workspacePath, noBackup); foreach (var item in msbuildWorkspace.WorkspaceItems) { if (diffOnly) { var differ = new Differ(item.UnconfiguredProject.FirstConfiguredProject, item.SdkBaselineProject.Project.FirstConfiguredProject); differ.GenerateReport(Directory.GetParent(workspacePath).FullName); } else { var converter = new Converter(item.UnconfiguredProject, item.SdkBaselineProject, item.ProjectRootElement); converter.Convert(item.ProjectRootElement.FullPath, tfm, keepCurrentTfms, allowPreviews); } } } catch (Exception e) { Console.WriteLine(e.ToString()); return(-1); } Console.WriteLine("Conversion complete!"); return(0); }
public static int Run(string?project, string?workspace, string?msbuildPath, string?tfm, bool forceWebConversion, bool preview, bool diffOnly, bool noBackup, bool keepCurrentTfms, bool update, bool mauiConversion, bool forceRemoveCustomImports) { if (update) { UpdateTryConvert.Update(); return(0); } if (!string.IsNullOrWhiteSpace(project) && !string.IsNullOrWhiteSpace(workspace)) { Console.WriteLine("Cannot specify both a project and a workspace."); return(-1); } if (!string.IsNullOrWhiteSpace(tfm) && keepCurrentTfms) { Console.WriteLine($"Both '{nameof(tfm)}' and '{nameof(keepCurrentTfms)}' cannot be specified. Please pick one."); return(-1); } try { //For Xamarin Projects, set MSBuild path to VSInstallation Dir via Environment Variable if (mauiConversion) { var vsinstalldir = Environment.GetEnvironmentVariable("VSINSTALLDIR"); if (!string.IsNullOrEmpty(vsinstalldir)) { msbuildPath = MSBuildHelpers.HookAssemblyResolveForMSBuild(Path.Combine(vsinstalldir, "MSBuild", "Current", "Bin")); } else { string vsPath = new VisualStudioLocator().GetLatestVisualStudioPath(); if (string.IsNullOrWhiteSpace(vsPath)) { Console.WriteLine("Error locating VS Install Directory. Try setting Environment Variable VSINSTALLDIR."); return(-1); } else { msbuildPath = MSBuildHelpers.HookAssemblyResolveForMSBuild(Path.Combine(vsPath, "MSBuild", "Current", "Bin")); } } } else { msbuildPath = MSBuildHelpers.HookAssemblyResolveForMSBuild(msbuildPath); } if (string.IsNullOrWhiteSpace(msbuildPath)) { Console.WriteLine("Could not find an MSBuild."); return(-1); } if (!string.IsNullOrWhiteSpace(tfm)) { tfm = tfm.Trim(); if (!TargetFrameworkHelper.IsValidTargetFramework(tfm)) { Console.WriteLine($"Invalid framework specified for --target-framework: '{tfm}'"); return(-1); } } else { tfm = TargetFrameworkHelper.FindHighestInstalledTargetFramework(preview, msbuildPath); } var workspacePath = string.Empty; MSBuildConversionWorkspaceType workspaceType; if (!string.IsNullOrWhiteSpace(project)) { workspacePath = Path.GetFullPath(project, Environment.CurrentDirectory); workspaceType = MSBuildConversionWorkspaceType.Project; } else { var(isSolution, workspaceFilePath) = MSBuildConversionWorkspaceFinder.FindWorkspace(Environment.CurrentDirectory, workspace); workspaceType = isSolution ? MSBuildConversionWorkspaceType.Solution : MSBuildConversionWorkspaceType.Project; workspacePath = workspaceFilePath; } var workspaceLoader = new MSBuildConversionWorkspaceLoader(workspacePath, workspaceType); // do not create backup if --diff-only specified noBackup = noBackup || diffOnly; var msbuildWorkspace = workspaceLoader.LoadWorkspace(workspacePath, noBackup, tfm, keepCurrentTfms, forceWebConversion); if (msbuildWorkspace.WorkspaceItems.Length is 0) { Console.WriteLine("No projects converted."); return(0); } foreach (var item in msbuildWorkspace.WorkspaceItems) { if (diffOnly) { var differ = new Differ(item.UnconfiguredProject.FirstConfiguredProject, item.SdkBaselineProject.Project.FirstConfiguredProject); var parent = Directory.GetParent(workspacePath); if (parent is null) { differ.GenerateReport(workspacePath); } else { differ.GenerateReport(parent.FullName); } } else { var converter = new Converter(item.UnconfiguredProject, item.SdkBaselineProject, item.ProjectRootElement, noBackup, forceRemoveCustomImports); converter.Convert(item.ProjectRootElement.FullPath); } } } catch (Exception e) { Console.WriteLine(e.ToString()); return(-1); } Console.WriteLine("Conversion complete!"); return(0); }
public static int Run(string project, string workspace, string msbuildPath, bool diffOnly, bool noBackup) { if (!string.IsNullOrWhiteSpace(project) && !string.IsNullOrWhiteSpace(workspace)) { Console.WriteLine("Cannot specify both a project and a workspace."); return(-1); } try { msbuildPath = MSBuildHelpers.HookAssemblyResolveForMSBuild(msbuildPath); if (string.IsNullOrWhiteSpace(msbuildPath)) { Console.WriteLine("Could not find an MSBuild."); return(-1); } var currentDirectory = Environment.CurrentDirectory; var workspacePath = string.Empty; MSBuildWorkspaceType workspaceType; if (!string.IsNullOrWhiteSpace(project)) { workspacePath = Path.GetFullPath(project, Environment.CurrentDirectory); workspaceType = MSBuildWorkspaceType.Project; } else if (!string.IsNullOrWhiteSpace(workspace)) { var(isSolution, workspaceFilePath) = MSBuildWorkspaceFinder.FindWorkspace(currentDirectory, workspace); workspaceType = isSolution ? MSBuildWorkspaceType.Solution : MSBuildWorkspaceType.Project; workspacePath = workspaceFilePath; } else { throw new ArgumentException("No valid arguments to fulfill a workspace are given."); } var workspaceLoader = new MSBuildWorkspaceLoader(workspacePath, workspaceType); var msbuildWorkspace = workspaceLoader.LoadWorkspace(workspacePath, noBackup); foreach (var item in msbuildWorkspace.WorkspaceItems) { if (diffOnly) { var differ = new Differ(item.UnconfiguredProject.FirstConfiguredProject, item.SdkBaselineProject.Project.FirstConfiguredProject); differ.GenerateReport(Directory.GetParent(workspacePath).FullName); } else { var converter = new Converter(item.UnconfiguredProject, item.SdkBaselineProject, item.ProjectRootElement); converter.Convert(item.ProjectRootElement.FullPath); } } } catch (Exception e) { Console.WriteLine(e.ToString()); return(-1); } Console.WriteLine("Conversion complete!"); return(0); }