diff --git a/GameBundle/Options.cs b/GameBundle/Options.cs index c0e4b7c..9e48780 100644 --- a/GameBundle/Options.cs +++ b/GameBundle/Options.cs @@ -23,6 +23,8 @@ namespace GameBundle { public bool MacBundle { get; set; } [Option("mac-bundle-resources", Default = new[] {"Content", "*.icns"}, HelpText = "When creating an app bundle for mac, things that should go into the Resources folder rather than the MacOS folder")] public IEnumerable MacBundleResources { get; set; } + [Option('z', "zip", HelpText = "Store the build results in zip files instead of folders")] + public bool Zip { get; set; } [Option('e', "exclude", HelpText = "Files that should not be moved to the library folder")] public IEnumerable ExcludedFiles { get; set; } @@ -34,6 +36,8 @@ namespace GameBundle { public string BuildConfig { get; set; } [Option("lib-name", Default = "Lib", HelpText = "The name of the library folder that is created")] public string LibFolder { get; set; } + [Option('n', "name-builds", HelpText = "Name the build output directories by the project's name")] + public bool NameBuilds { get; set; } } } \ No newline at end of file diff --git a/GameBundle/Program.cs b/GameBundle/Program.cs index f4c649d..cf65c86 100644 --- a/GameBundle/Program.cs +++ b/GameBundle/Program.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.IO.Compression; using System.Linq; using System.Text.RegularExpressions; using CommandLine; @@ -25,37 +26,40 @@ namespace GameBundle { } Console.WriteLine("Bundling project " + proj.FullName); - var bundleDir = new DirectoryInfo(options.OutputDirectory); - if (!bundleDir.Exists) - bundleDir.Create(); - + var builtAnything = false; if (options.BuildWindows) { Console.WriteLine("Bundling for windows"); - var res = Publish(options, proj, $"{bundleDir.FullName}/win", options.Publish32Bit ? "win-x86" : "win-x64"); + var res = Publish(options, proj, GetBuildDir(options, proj, "win"), options.Publish32Bit ? "win-x86" : "win-x64"); if (res != 0) return res; + builtAnything = true; } if (options.BuildLinux) { Console.WriteLine("Bundling for linux"); - var res = Publish(options, proj, $"{bundleDir.FullName}/linux", "linux-x64"); + var res = Publish(options, proj, GetBuildDir(options, proj, "linux"), "linux-x64"); if (res != 0) return res; + builtAnything = true; } if (options.BuildMac) { Console.WriteLine("Bundling for mac"); - var dir = $"{bundleDir.FullName}/mac"; - var res = Publish(options, proj, dir, "osx-x64"); + var dir = GetBuildDir(options, proj, "mac"); + var res = Publish(options, proj, dir, "osx-x64", () => { + if (options.MacBundle) + CreateMacBundle(options, new DirectoryInfo(dir), proj.FullName); + }); if (res != 0) return res; - if (options.MacBundle) - CreateMacBundle(options, new DirectoryInfo(dir), proj.FullName); + builtAnything = true; } + if (!builtAnything) + Console.WriteLine("No build took place. Supply -w, -l or -m arguments or see available arguments using --help."); Console.WriteLine("Done"); return 0; } - private static int Publish(Options options, FileInfo proj, string path, string rid) { + private static int Publish(Options options, FileInfo proj, string path, string rid, Action additionalAction = null) { var publishResult = RunProcess(options, "dotnet", $"publish {proj.FullName} -o {path} -r {rid} -c {options.BuildConfig} /p:PublishTrimmed={options.Trim}"); if (publishResult != 0) return publishResult; @@ -71,6 +75,17 @@ namespace GameBundle { var beautyFile = new FileInfo(Path.Combine(path, "NetCoreBeauty")); if (beautyFile.Exists) beautyFile.Delete(); + + // Run any additional actions like creating the mac bundle + additionalAction?.Invoke(); + + // Zip the output if required + if (options.Zip) { + var zipLocation = Path.Combine(Directory.GetParent(path).FullName, Path.GetFileName(path) + ".zip"); + File.Delete(zipLocation); + ZipFile.CreateFromDirectory(path, zipLocation, CompressionLevel.Optimal, true); + Directory.Delete(path, true); + } return 0; } @@ -125,5 +140,12 @@ namespace GameBundle { return new Regex('(' + string.Join("|", strings.Select(s => s.Replace(".", "[.]").Replace("*", ".*").Replace("?", "."))) + ')'); } + private static string GetBuildDir(Options options, FileInfo proj, string osName) { + var dir = Path.GetFullPath(options.OutputDirectory); + if (options.NameBuilds) + return $"{dir}/{Path.GetFileNameWithoutExtension(proj.Name)}-{osName}"; + return $"{dir}/{osName}"; + } + } } \ No newline at end of file diff --git a/Test/Bundle.bat b/Test/Bundle.bat index 0182851..3c1ba7a 100644 --- a/Test/Bundle.bat +++ b/Test/Bundle.bat @@ -1 +1 @@ -"../GameBundle/bin/Debug/netcoreapp3.1/GameBundle.exe" -wlmb -s Test.csproj -o bin/Bundled -v \ No newline at end of file +"../GameBundle/bin/Debug/netcoreapp3.1/GameBundle.exe" -wlm -bzn -s Test.csproj -o bin/Bundled -v \ No newline at end of file