From e2d4f041ab988fcf6b1217028aad629acba15d89 Mon Sep 17 00:00:00 2001 From: "Matthew Parker [SSW]" <61717342+MattParkerDev@users.noreply.github.com> Date: Sun, 16 Nov 2025 17:09:40 +1000 Subject: [PATCH] Fix running on macos via .app --- .../Features/Build/SharpIdeMsbuildLocator.cs | 36 +++++++++++++++++++ src/SharpIDE.Godot/IdeWindow.cs | 9 ++--- 2 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 src/SharpIDE.Application/Features/Build/SharpIdeMsbuildLocator.cs diff --git a/src/SharpIDE.Application/Features/Build/SharpIdeMsbuildLocator.cs b/src/SharpIDE.Application/Features/Build/SharpIdeMsbuildLocator.cs new file mode 100644 index 0000000..a6254df --- /dev/null +++ b/src/SharpIDE.Application/Features/Build/SharpIdeMsbuildLocator.cs @@ -0,0 +1,36 @@ +using System.Diagnostics; +using Microsoft.Build.Locator; + +namespace SharpIDE.Application.Features.Build; + +public static class SharpIdeMsbuildLocator +{ + public static void Register() + { + if (OperatingSystem.IsMacOS()) + { + FixMacosPath(); + } + // Use latest version - https://github.com/microsoft/MSBuildLocator/issues/81 + var instance = MSBuildLocator.QueryVisualStudioInstances().MaxBy(s => s.Version); + if (instance is null) throw new InvalidOperationException("No MSBuild instances found"); + MSBuildLocator.RegisterInstance(instance); + } + + // https://github.com/microsoft/MSBuildLocator/issues/361 + private static void FixMacosPath() + { + var processStartInfo = new ProcessStartInfo + { + FileName = "/bin/zsh", + ArgumentList = { "-l", "-c", "printenv PATH" }, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + }; + using var process = Process.Start(processStartInfo); + var output = process!.StandardOutput.ReadToEnd().Trim(); + process.WaitForExit(); + Environment.SetEnvironmentVariable("PATH", output, EnvironmentVariableTarget.Process); + } +} diff --git a/src/SharpIDE.Godot/IdeWindow.cs b/src/SharpIDE.Godot/IdeWindow.cs index 2716f6f..eae38fb 100644 --- a/src/SharpIDE.Godot/IdeWindow.cs +++ b/src/SharpIDE.Godot/IdeWindow.cs @@ -1,8 +1,6 @@ using Godot; -using Microsoft.Build.Locator; using Microsoft.Extensions.Hosting; -using SharpIDE.Application.Features.Events; -using SharpIDE.Application.Features.FilePersistence; +using SharpIDE.Application.Features.Build; using SharpIDE.Godot.Features.IdeSettings; using SharpIDE.Godot.Features.SlnPicker; @@ -26,10 +24,7 @@ public partial class IdeWindow : Control GD.Print("IdeWindow _Ready called"); ResourceLoader.LoadThreadedRequest(SlnPickerScenePath); ResourceLoader.LoadThreadedRequest(IdeRootScenePath); - // Use latest version - https://github.com/microsoft/MSBuildLocator/issues/81 - var instance = MSBuildLocator.QueryVisualStudioInstances().MaxBy(s => s.Version); - if (instance is null) throw new InvalidOperationException("No MSBuild instances found"); - MSBuildLocator.RegisterInstance(instance); + SharpIdeMsbuildLocator.Register(); GodotOtelExtensions.AddServiceDefaults(); Singletons.AppState = AppStateLoader.LoadAppStateFromConfigFile(); //GetWindow().SetMinSize(new Vector2I(1152, 648));