From 432cfecb022f080e95083127d30307e799176be4 Mon Sep 17 00:00:00 2001 From: Robert Muehsig Date: Tue, 17 Oct 2017 22:30:41 +0200 Subject: [PATCH 01/11] Update README.md --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4cf43d2..2ba8976 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![Electron.NET Logo](https://github.com/GregorBiswanger/Electron.NET/blob/master/assets/images/electron.net-logo.png)](https://github.com/GregorBiswanger/Electron.NET) -[![Build status](https://ci.appveyor.com/api/projects/status/u710d6hman5a4beb/branch/cli-etc?svg=true)](https://ci.appveyor.com/project/robertmuehsig/electron-net/branch/cli-etc) +Master: [![Build status](https://ci.appveyor.com/api/projects/status/u710d6hman5a4beb/branch/master?svg=true)](https://ci.appveyor.com/project/robertmuehsig/electron-net/branch/master) Build cross platform desktop apps with .NET Core and ASP.NET NET Core. @@ -13,7 +13,8 @@ Currently there are two main projects and a "WebApp" that serves as a demo playg Both projects create their own nuget package. The resulting nuget packages are saved under "/artifacts". -__Currently__ the packages are just build with version 1.0.0. If you change something you need to clear the nuget cache under this directory (because the version number doesn't change): +__Currently__ the packages are just build with version 1.0.0. +If you change something you need to clear the nuget cache under this directory (because the version number doesn't change): %userprofile%\.nuget\packages @@ -33,7 +34,9 @@ Navigate to the WebApp folder and type this in a command prompt: dotnet electronize -# Dev Notes: Dev Workflow (at least for the CLI extension is this a must) +# Dev Notes: Dev Workflow + +(at least for the CLI extension) * Change something in the CLI project * rebuild the project (a nuget package should now appear in the /artifacts directory) From af6dc1c0702aa20654fd72611458cda82af4a7a8 Mon Sep 17 00:00:00 2001 From: Robert Muehsig Date: Tue, 17 Oct 2017 22:31:03 +0200 Subject: [PATCH 02/11] remove branch --- appveyor.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 1387a76..de58500 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,7 +1,4 @@ version: 1.0.{build} -branches: - only: - - cli-etc image: Visual Studio 2017 build_script: - cmd: buildAll.cmd From 8f47727078707988a7fa07dd45ae792a2cd7d826 Mon Sep 17 00:00:00 2001 From: Robert Muehsig Date: Tue, 17 Oct 2017 23:15:05 +0200 Subject: [PATCH 03/11] make it possible to build all other configurations --- ElectronNET.CLI/Commands/BuildCommand.cs | 90 ++++++++++++++---------- ElectronNET.CLI/Commands/InitCommand.cs | 23 +++++- ElectronNET.CLI/Program.cs | 4 +- ElectronNET.CLI/devCleanup.cmd | 4 +- 4 files changed, 80 insertions(+), 41 deletions(-) diff --git a/ElectronNET.CLI/Commands/BuildCommand.cs b/ElectronNET.CLI/Commands/BuildCommand.cs index 06b8b05..757f05a 100644 --- a/ElectronNET.CLI/Commands/BuildCommand.cs +++ b/ElectronNET.CLI/Commands/BuildCommand.cs @@ -10,41 +10,77 @@ namespace ElectronNET.CLI.Commands { public const string COMMAND_NAME = "build"; public const string COMMAND_DESCRIPTION = "Build your Electron Application."; - public const string COMMAND_ARGUMENTS = " from ASP.NET Core Project."; + public const string COMMAND_ARGUMENTS = " to build (default is current OS, possible values are: win,osx,linux)"; public static IList CommandOptions { get; set; } = new List(); + private string[] _args; + + public BuildCommand(string[] args) + { + _args = args; + } + public Task ExecuteAsync() { return Task.Run(() => { Console.WriteLine("Build Electron Application..."); + string desiredPlatform = ""; + + if (_args.Length > 0) + { + desiredPlatform = _args[0]; + } + + string tempPath = Path.Combine(Directory.GetCurrentDirectory(), "obj", "desktop"); Console.WriteLine("Executing dotnet publish in this directory: " + tempPath); string tempBinPath = Path.Combine(tempPath, "bin"); - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - Console.WriteLine("Build ASP.NET Core App for Windows..."); + string netCorePublishRid = string.Empty; + string electronPackerPlatform = string.Empty; - ProcessHelper.CmdExecute($"dotnet publish -r win10-x64 --output \"{tempBinPath}\"", Directory.GetCurrentDirectory()); + switch (desiredPlatform) + { + case "win": + netCorePublishRid = "win10-x64"; + electronPackerPlatform = "win32"; + break; + case "osx": + netCorePublishRid = "osx-x64"; + electronPackerPlatform = "darwin"; + break; + case "linux": + netCorePublishRid = "ubuntu-x64"; + electronPackerPlatform = "linux"; + break; + default: + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + netCorePublishRid = "win10-x64"; + electronPackerPlatform = "win32"; + } + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + netCorePublishRid = "osx-x64"; + electronPackerPlatform = "darwin"; + } + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + netCorePublishRid = "ubuntu-x64"; + electronPackerPlatform = "linux"; + } + + break; } - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - Console.WriteLine("Build ASP.NET Core App for OSX..."); + Console.WriteLine($"Build ASP.NET Core App for {netCorePublishRid}..."); - ProcessHelper.CmdExecute($"dotnet publish -r osx-x64 --output \"{tempBinPath}\"", Directory.GetCurrentDirectory()); - } + ProcessHelper.CmdExecute($"dotnet publish -r {netCorePublishRid} --output \"{tempBinPath}\"", Directory.GetCurrentDirectory()); - if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - { - Console.WriteLine("Build ASP.NET Core App for Linux (Ubuntu x64)..."); - - ProcessHelper.CmdExecute($"dotnet publish -r ubuntu-x64 --output \"{tempBinPath}\"", Directory.GetCurrentDirectory()); - } if (Directory.Exists(tempPath) == false) { @@ -90,26 +126,8 @@ namespace ElectronNET.CLI.Commands Console.WriteLine("Executing electron magic in this directory: " + buildPath); // ToDo: Need a solution for --asar support - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - Console.WriteLine("Package Electron App for Windows..."); - - ProcessHelper.CmdExecute($"electron-packager . --platform=win32 --arch=x64 --out=\"{buildPath}\" --overwrite", tempPath); - } - - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - Console.WriteLine("Package Electron App for OSX..."); - - ProcessHelper.CmdExecute($"electron-packager . --platform=darwin --arch=x64 --out=\"{buildPath}\" --overwrite", tempPath); - } - - if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - { - Console.WriteLine("Package Electron App for Linux..."); - - ProcessHelper.CmdExecute($"electron-packager . --platform=linux --arch=x64 --out=\"{buildPath}\" --overwrite", tempPath); - } + Console.WriteLine($"Package Electron App for Platform {electronPackerPlatform}..."); + ProcessHelper.CmdExecute($"electron-packager . --platform={electronPackerPlatform} --arch=x64 --out=\"{buildPath}\" --overwrite", tempPath); Console.WriteLine("... done"); diff --git a/ElectronNET.CLI/Commands/InitCommand.cs b/ElectronNET.CLI/Commands/InitCommand.cs index 08fffb9..96f348b 100644 --- a/ElectronNET.CLI/Commands/InitCommand.cs +++ b/ElectronNET.CLI/Commands/InitCommand.cs @@ -17,11 +17,32 @@ namespace ElectronNET.CLI.Commands private const string ConfigName = "electron.manifest.json"; + private string[] _args; + + public InitCommand(string[] args) + { + _args = args; + } + public Task ExecuteAsync() { return Task.Run(() => { - var currentDirectory = Directory.GetCurrentDirectory(); + string aspCoreProjectPath = ""; + + if (_args.Length > 0) + { + if (Directory.Exists(_args[0])) + { + aspCoreProjectPath = _args[0]; + } + } + else + { + aspCoreProjectPath = Directory.GetCurrentDirectory(); + } + + var currentDirectory = aspCoreProjectPath; Console.WriteLine("Adding our config file to your project..."); diff --git a/ElectronNET.CLI/Program.cs b/ElectronNET.CLI/Program.cs index 63caac0..76936e9 100644 --- a/ElectronNET.CLI/Program.cs +++ b/ElectronNET.CLI/Program.cs @@ -28,10 +28,10 @@ namespace ElectronNET.CLI command = new StartElectronCommand(args.Skip(1).ToArray()); break; case BuildCommand.COMMAND_NAME: - command = new BuildCommand(); + command = new BuildCommand(args.Skip(1).ToArray()); break; case InitCommand.COMMAND_NAME: - command = new InitCommand(); + command = new InitCommand(args.Skip(1).ToArray()); break; case "--help": case "--h": diff --git a/ElectronNET.CLI/devCleanup.cmd b/ElectronNET.CLI/devCleanup.cmd index 803ea4f..4f81c99 100644 --- a/ElectronNET.CLI/devCleanup.cmd +++ b/ElectronNET.CLI/devCleanup.cmd @@ -1,2 +1,2 @@ -rd /s /q %userprofile%\.nuget\packages\.tools\electronnet.cli 2>nul -rd /s /q %userprofile%\.nuget\packages\electronnet.cli 2>nul +rd /s /q %userprofile%\.nuget\packages\.tools\electronnet.cli +rd /s /q %userprofile%\.nuget\packages\electronnet.cli From eb716793f71ad901f642cdd8800fc7870db6606d Mon Sep 17 00:00:00 2001 From: Robert Muehsig Date: Tue, 17 Oct 2017 23:24:03 +0200 Subject: [PATCH 04/11] square logo --- assets/images/electron.net-logo-square.png | Bin 0 -> 39446 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/images/electron.net-logo-square.png diff --git a/assets/images/electron.net-logo-square.png b/assets/images/electron.net-logo-square.png new file mode 100644 index 0000000000000000000000000000000000000000..10d55ebe2477afb3d51044c5b642303942e31c1d GIT binary patch literal 39446 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 V=Mq`N85kHCJYD@<);T3K0RX`utw#U= literal 0 HcmV?d00001 From 385c4fcd1af166a9a3854a630b3880d9ee0e35ce Mon Sep 17 00:00:00 2001 From: Robert Muehsig Date: Tue, 17 Oct 2017 23:33:52 +0200 Subject: [PATCH 05/11] nuget meta data --- ElectronNET.API/ElectronNET.API.csproj | 11 +++++++++++ ElectronNET.CLI/ElectronNET.CLI.csproj | 12 ++++++++++++ buildReleaseNuGetPackages.cmd | 8 ++++++++ 3 files changed, 31 insertions(+) create mode 100644 buildReleaseNuGetPackages.cmd diff --git a/ElectronNET.API/ElectronNET.API.csproj b/ElectronNET.API/ElectronNET.API.csproj index 0dfc108..16d0aa4 100644 --- a/ElectronNET.API/ElectronNET.API.csproj +++ b/ElectronNET.API/ElectronNET.API.csproj @@ -5,6 +5,17 @@ true ..\artifacts ElectronNET.API + Gregor Biswanger, Robert Muehsig + + Electron.NET + https://github.com/GregorBiswanger/Electron.NET/blob/master/LICENSE + https://github.com/GregorBiswanger/Electron.NET/ + Building cross platform electron based desktop apps with .NET Core and ASP.NET NET Core. +This package contains the API to access the "native" electron API. + https://github.com/GregorBiswanger/Electron.NET/ + electron aspnetcore + #0.0.1 +- alpha release diff --git a/ElectronNET.CLI/ElectronNET.CLI.csproj b/ElectronNET.CLI/ElectronNET.CLI.csproj index eb487c8..1692636 100644 --- a/ElectronNET.CLI/ElectronNET.CLI.csproj +++ b/ElectronNET.CLI/ElectronNET.CLI.csproj @@ -10,6 +10,18 @@ ..\artifacts ElectronNET.CLI 1.0.0 + Gregor Biswanger, Robert Muehsig + Electron.NET + + Building cross platform electron based desktop apps with .NET Core and ASP.NET NET Core. +This package contains the dotnet tooling to electronize your application. + https://github.com/GregorBiswanger/Electron.NET/blob/master/LICENSE + https://github.com/GregorBiswanger/Electron.NET/ + https://github.com/GregorBiswanger/Electron.NET/ + electron aspnetcore + #0.0.1 +- alpha release + https://raw.githubusercontent.com/GregorBiswanger/Electron.NET/master/assets/images/electron.net-logo-square.png diff --git a/buildReleaseNuGetPackages.cmd b/buildReleaseNuGetPackages.cmd new file mode 100644 index 0000000..1bc4f38 --- /dev/null +++ b/buildReleaseNuGetPackages.cmd @@ -0,0 +1,8 @@ +echo "Start building Electron.NET dev stack..." +echo "Restore & Build API" +cd ElectronNet.API +dotnet restore +cd .. +echo "Restore & Build API" +cd ElectronNet.CLI +dotnet restore From b0b3eb3e93b64ecfdef6473886320f0424933d7a Mon Sep 17 00:00:00 2001 From: Robert Muehsig Date: Tue, 17 Oct 2017 23:34:00 +0200 Subject: [PATCH 06/11] adding the version number --- buildReleaseNuGetPackages.cmd | 2 ++ 1 file changed, 2 insertions(+) diff --git a/buildReleaseNuGetPackages.cmd b/buildReleaseNuGetPackages.cmd index 1bc4f38..d5572dc 100644 --- a/buildReleaseNuGetPackages.cmd +++ b/buildReleaseNuGetPackages.cmd @@ -2,7 +2,9 @@ echo "Start building Electron.NET dev stack..." echo "Restore & Build API" cd ElectronNet.API dotnet restore +dotnet pack /p:PackageVersion=0.0.1 --output %~dp0artifacts cd .. echo "Restore & Build API" cd ElectronNet.CLI dotnet restore +dotnet pack /p:PackageVersion=0.0.1 --output %~dp0artifacts From 04a334faf708cb0467a644adea15d904139bf0c3 Mon Sep 17 00:00:00 2001 From: Robert Muehsig Date: Tue, 17 Oct 2017 23:48:02 +0200 Subject: [PATCH 07/11] Update README.md --- README.md | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 2ba8976..f9f2c63 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,34 @@ Master: [![Build status](https://ci.appveyor.com/api/projects/status/u710d6hman5 Build cross platform desktop apps with .NET Core and ASP.NET NET Core. +# Usage: + +* To communicate with the "native" (sort of native...) Electron API include the [ElectronNET.API NuGet package](https://www.nuget.org/packages/ElectronNET.API/) in your ASP.NET Core app. + +* For the tooling you will need your dotnet-electronize package [ElectronNET.CLI NuGet package](https://www.nuget.org/packages/ElectronNET.CLI/). This package __must__ be referenced in the .csproj like this: + + + + + +* Make sure you have node.js and on OSX/Ubuntu the electron-packager installed (via "sudo npm install electron-packager --global") +* In your ASP.NET Core folder run: + + dotnet electronize init + +* Now a electronnet.manifest.json should appear in your ASP.NET Core project +* Now run the following: + + dotnet electronize build + +* In your default setting we just build the application for the OS you are running (Windows builds Windows, OSX builds OSX etc.), but this can be changed with: + + dotnet electronize build win + dotnet electronize build osx + dotnet electronize build linux + +* The end result should be a electron app under your /bin/desktop folder + ## Dev Notes: Currently there are two main projects and a "WebApp" that serves as a demo playground. @@ -13,12 +41,7 @@ Currently there are two main projects and a "WebApp" that serves as a demo playg Both projects create their own nuget package. The resulting nuget packages are saved under "/artifacts". -__Currently__ the packages are just build with version 1.0.0. -If you change something you need to clear the nuget cache under this directory (because the version number doesn't change): - - %userprofile%\.nuget\packages - -The solution contains a NuGet.config which points to the artifacts directory, so we can just use the produced NuGet packages without uploading to NuGet.org. +__Currently__ the packages are just build with version 1.0.0 on your machine. NuGet might pick the wrong version from its own cache, so please read the dev notes if you want to develop! __ElectronNET.WebApp:__ @@ -28,11 +51,7 @@ The WebApp now has referenced the API NuGet package and via the .csproj referenc -## Dev Notes: Usage -Navigate to the WebApp folder and type this in a command prompt: - - dotnet electronize # Dev Notes: Dev Workflow From a172a95f7ecbc02a48e3aba55162bc03437fd354 Mon Sep 17 00:00:00 2001 From: Robert Muehsig Date: Tue, 17 Oct 2017 23:49:24 +0200 Subject: [PATCH 08/11] Update README.md --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f9f2c63..e4a735f 100644 --- a/README.md +++ b/README.md @@ -10,15 +10,19 @@ Build cross platform desktop apps with .NET Core and ASP.NET NET Core. * For the tooling you will need your dotnet-electronize package [ElectronNET.CLI NuGet package](https://www.nuget.org/packages/ElectronNET.CLI/). This package __must__ be referenced in the .csproj like this: +``` - +``` + * Make sure you have node.js and on OSX/Ubuntu the electron-packager installed (via "sudo npm install electron-packager --global") * In your ASP.NET Core folder run: +``` dotnet electronize init - +``` + * Now a electronnet.manifest.json should appear in your ASP.NET Core project * Now run the following: @@ -26,9 +30,11 @@ Build cross platform desktop apps with .NET Core and ASP.NET NET Core. * In your default setting we just build the application for the OS you are running (Windows builds Windows, OSX builds OSX etc.), but this can be changed with: +``` dotnet electronize build win dotnet electronize build osx dotnet electronize build linux +``` * The end result should be a electron app under your /bin/desktop folder From 1c579c75ebee37f18d8b731377d0b45475faeb20 Mon Sep 17 00:00:00 2001 From: Robert Muehsig Date: Tue, 17 Oct 2017 23:49:44 +0200 Subject: [PATCH 09/11] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e4a735f..5042af2 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,10 @@ Build cross platform desktop apps with .NET Core and ASP.NET NET Core. * Now a electronnet.manifest.json should appear in your ASP.NET Core project * Now run the following: +``` dotnet electronize build - +``` + * In your default setting we just build the application for the OS you are running (Windows builds Windows, OSX builds OSX etc.), but this can be changed with: ``` From 80c7480190fac990fdd3e2547d1f0a671aa8d3fe Mon Sep 17 00:00:00 2001 From: Robert Muehsig Date: Tue, 17 Oct 2017 23:55:53 +0200 Subject: [PATCH 10/11] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5042af2..a2729b7 100644 --- a/README.md +++ b/README.md @@ -68,5 +68,5 @@ The WebApp now has referenced the API NuGet package and via the .csproj referenc * Change something in the CLI project * rebuild the project (a nuget package should now appear in the /artifacts directory) * make sure there is no ElectronNET.CLI package in your %userprofile%\.nuget\packages cache with the same version -* execute dotnet restore in the WebApp +* execute dotnet restore in the WebApp * execute dotnet electronize From d8c5e3221950cf461822eb304afa996e9942665a Mon Sep 17 00:00:00 2001 From: Robert Muehsig Date: Tue, 17 Oct 2017 23:59:10 +0200 Subject: [PATCH 11/11] Update appveyor.yml