ProjectUtils.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using System;
  2. using System.Linq;
  3. using Microsoft.Build.Construction;
  4. using Microsoft.Build.Locator;
  5. namespace GodotTools.ProjectEditor
  6. {
  7. public sealed class MSBuildProject
  8. {
  9. internal ProjectRootElement Root { get; set; }
  10. public bool HasUnsavedChanges { get; set; }
  11. public void Save() => Root.Save();
  12. public MSBuildProject(ProjectRootElement root)
  13. {
  14. Root = root;
  15. }
  16. }
  17. public static class ProjectUtils
  18. {
  19. public static void MSBuildLocatorRegisterLatest(out Version version, out string path)
  20. {
  21. var instance = MSBuildLocator.QueryVisualStudioInstances()
  22. .OrderByDescending(x => x.Version)
  23. .First();
  24. MSBuildLocator.RegisterInstance(instance);
  25. version = instance.Version;
  26. path = instance.MSBuildPath;
  27. }
  28. public static void MSBuildLocatorRegisterMSBuildPath(string msbuildPath)
  29. => MSBuildLocator.RegisterMSBuildPath(msbuildPath);
  30. public static MSBuildProject? Open(string path)
  31. {
  32. var root = ProjectRootElement.Open(path);
  33. return root != null ? new MSBuildProject(root) : null;
  34. }
  35. public static void MigrateToProjectSdksStyle(MSBuildProject project, string projectName)
  36. {
  37. var origRoot = project.Root;
  38. if (!string.IsNullOrEmpty(origRoot.Sdk))
  39. return;
  40. project.Root = ProjectGenerator.GenGameProject(projectName);
  41. project.Root.FullPath = origRoot.FullPath;
  42. project.HasUnsavedChanges = true;
  43. }
  44. public static void EnsureGodotSdkIsUpToDate(MSBuildProject project)
  45. {
  46. var root = project.Root;
  47. string godotSdkAttrValue = ProjectGenerator.GodotSdkAttrValue;
  48. if (!string.IsNullOrEmpty(root.Sdk) &&
  49. root.Sdk.Trim().Equals(godotSdkAttrValue, StringComparison.OrdinalIgnoreCase))
  50. return;
  51. root.Sdk = godotSdkAttrValue;
  52. project.HasUnsavedChanges = true;
  53. }
  54. }
  55. }