added the ability to zip content

This commit is contained in:
Ellpeck 2020-09-02 17:23:49 +02:00
parent 0bd0c9febe
commit c084765045
3 changed files with 38 additions and 12 deletions

View file

@ -23,6 +23,8 @@ namespace GameBundle {
public bool MacBundle { get; set; } 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")] [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<string> MacBundleResources { get; set; } public IEnumerable<string> 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")] [Option('e', "exclude", HelpText = "Files that should not be moved to the library folder")]
public IEnumerable<string> ExcludedFiles { get; set; } public IEnumerable<string> ExcludedFiles { get; set; }
@ -34,6 +36,8 @@ namespace GameBundle {
public string BuildConfig { get; set; } public string BuildConfig { get; set; }
[Option("lib-name", Default = "Lib", HelpText = "The name of the library folder that is created")] [Option("lib-name", Default = "Lib", HelpText = "The name of the library folder that is created")]
public string LibFolder { get; set; } 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; }
} }
} }

View file

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.IO.Compression;
using System.Linq; using System.Linq;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using CommandLine; using CommandLine;
@ -25,37 +26,40 @@ namespace GameBundle {
} }
Console.WriteLine("Bundling project " + proj.FullName); Console.WriteLine("Bundling project " + proj.FullName);
var bundleDir = new DirectoryInfo(options.OutputDirectory); var builtAnything = false;
if (!bundleDir.Exists)
bundleDir.Create();
if (options.BuildWindows) { if (options.BuildWindows) {
Console.WriteLine("Bundling for windows"); 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) if (res != 0)
return res; return res;
builtAnything = true;
} }
if (options.BuildLinux) { if (options.BuildLinux) {
Console.WriteLine("Bundling for linux"); 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) if (res != 0)
return res; return res;
builtAnything = true;
} }
if (options.BuildMac) { if (options.BuildMac) {
Console.WriteLine("Bundling for mac"); Console.WriteLine("Bundling for mac");
var dir = $"{bundleDir.FullName}/mac"; var dir = GetBuildDir(options, proj, "mac");
var res = Publish(options, proj, dir, "osx-x64"); var res = Publish(options, proj, dir, "osx-x64", () => {
if (options.MacBundle)
CreateMacBundle(options, new DirectoryInfo(dir), proj.FullName);
});
if (res != 0) if (res != 0)
return res; return res;
if (options.MacBundle) builtAnything = true;
CreateMacBundle(options, new DirectoryInfo(dir), proj.FullName);
} }
if (!builtAnything)
Console.WriteLine("No build took place. Supply -w, -l or -m arguments or see available arguments using --help.");
Console.WriteLine("Done"); Console.WriteLine("Done");
return 0; 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}"); var publishResult = RunProcess(options, "dotnet", $"publish {proj.FullName} -o {path} -r {rid} -c {options.BuildConfig} /p:PublishTrimmed={options.Trim}");
if (publishResult != 0) if (publishResult != 0)
return publishResult; return publishResult;
@ -71,6 +75,17 @@ namespace GameBundle {
var beautyFile = new FileInfo(Path.Combine(path, "NetCoreBeauty")); var beautyFile = new FileInfo(Path.Combine(path, "NetCoreBeauty"));
if (beautyFile.Exists) if (beautyFile.Exists)
beautyFile.Delete(); 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; return 0;
} }
@ -125,5 +140,12 @@ namespace GameBundle {
return new Regex('(' + string.Join("|", strings.Select(s => s.Replace(".", "[.]").Replace("*", ".*").Replace("?", "."))) + ')'); 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}";
}
} }
} }

View file

@ -1 +1 @@
"../GameBundle/bin/Debug/netcoreapp3.1/GameBundle.exe" -wlmb -s Test.csproj -o bin/Bundled -v "../GameBundle/bin/Debug/netcoreapp3.1/GameBundle.exe" -wlm -bzn -s Test.csproj -o bin/Bundled -v