diff --git a/ElectronNET.CLI/Commands/InitCommand.cs b/ElectronNET.CLI/Commands/InitCommand.cs index 96f348b..592d608 100644 --- a/ElectronNET.CLI/Commands/InitCommand.cs +++ b/ElectronNET.CLI/Commands/InitCommand.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; +using System.Text; using System.Threading.Tasks; using System.Xml.Linq; @@ -69,46 +70,88 @@ namespace ElectronNET.CLI.Commands Console.WriteLine($"Found your .csproj: {projectFile} - check for existing config or update it."); - using (var stream = File.Open(projectFile, FileMode.OpenOrCreate, FileAccess.ReadWrite)) - { - var xmlDocument = XDocument.Load(stream); + if (!EditCsProj(projectFile)) return false; - var projectElement = xmlDocument.Descendants("Project").FirstOrDefault(); - if (projectElement == null || projectElement.Attribute("Sdk")?.Value != "Microsoft.NET.Sdk.Web") - { - Console.WriteLine($"Project file is not a compatible type of 'Microsoft.NET.Sdk.Web'. Your project: {projectElement?.Attribute("Sdk")?.Value}"); - return false; - } + // search launchSettings.json + Console.WriteLine($"Search your .launchSettings to add our electron debug profile..."); - if (xmlDocument.ToString().Contains($"Content Update=\"{ConfigName}\"")) - { - Console.WriteLine($"{ConfigName} already in csproj."); - return false; - } + EditLaunchSettings(currentDirectory); - Console.WriteLine($"{ConfigName} will be added to csproj."); - - string itemGroupXmlString = "" + - "" + - "PreserveNewest" + - "" + - ""; - - var newItemGroupForConfig = XElement.Parse(itemGroupXmlString); - xmlDocument.Root.Add(newItemGroupForConfig); - - stream.SetLength(0); - stream.Position = 0; - - xmlDocument.Save(stream); - - Console.WriteLine($"{ConfigName} added in csproj - happy electronizing!"); - } + Console.WriteLine($"Everything done - happy electronizing!"); return true; }); } + private static void EditLaunchSettings(string currentDirectory) + { + // super stupid implementation, but because there is no nativ way to parse json + // and cli extensions and other nuget packages are buggy + // this is should solve the problem for 80% of the users + // for the other 20% we might fail... + var launchSettingFile = Path.Combine(currentDirectory, "Properties", "launchSettings.json"); + string launchSettingText = File.ReadAllText(launchSettingFile); + if (launchSettingText.Contains("electronize start") == false) + { + StringBuilder debugProfileBuilder = new StringBuilder(); + debugProfileBuilder.AppendLine("profiles\": {"); + debugProfileBuilder.AppendLine("\"Electron.NET App\": {"); + debugProfileBuilder.AppendLine("\"commandName\": \"Executable\","); + debugProfileBuilder.AppendLine("\"executablePath\": \"C:\\\\Program Files\\\\dotnet\\\\dotnet.exe\","); + debugProfileBuilder.AppendLine("\"commandLineArgs\": \"electronize start\""); + debugProfileBuilder.AppendLine("},"); + + launchSettingText = launchSettingText.Replace("profiles\": {", debugProfileBuilder.ToString()); + File.WriteAllText(launchSettingFile, launchSettingText); + + Console.WriteLine($"Debug profile added!"); + } + else + { + Console.WriteLine($"Debug profile already existing"); + } + } + + private static bool EditCsProj(string projectFile) + { + using (var stream = File.Open(projectFile, FileMode.OpenOrCreate, FileAccess.ReadWrite)) + { + var xmlDocument = XDocument.Load(stream); + + var projectElement = xmlDocument.Descendants("Project").FirstOrDefault(); + if (projectElement == null || projectElement.Attribute("Sdk")?.Value != "Microsoft.NET.Sdk.Web") + { + Console.WriteLine( + $"Project file is not a compatible type of 'Microsoft.NET.Sdk.Web'. Your project: {projectElement?.Attribute("Sdk")?.Value}"); + return false; + } + + if (xmlDocument.ToString().Contains($"Content Update=\"{ConfigName}\"")) + { + Console.WriteLine($"{ConfigName} already in csproj."); + return false; + } + + Console.WriteLine($"{ConfigName} will be added to csproj."); + + string itemGroupXmlString = "" + + "" + + "PreserveNewest" + + "" + + ""; + + var newItemGroupForConfig = XElement.Parse(itemGroupXmlString); + xmlDocument.Root.Add(newItemGroupForConfig); + + stream.SetLength(0); + stream.Position = 0; + + xmlDocument.Save(stream); + + Console.WriteLine($"{ConfigName} added in csproj!"); + } + return true; + } } }