fixed mac app bundle by introducing PkgInfo and naming app properly

This commit is contained in:
Ell 2021-10-16 19:27:25 +02:00
parent 5ac15ed5b7
commit 64a56b25d4
4 changed files with 24 additions and 12 deletions

View file

@ -37,8 +37,6 @@ namespace GameBundle {
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")] [Option('n', "name-builds", HelpText = "Name the build output directories by the project's name")]
public bool NameBuilds { get; set; } public bool NameBuilds { get; set; }
[Option('d', "display-name", HelpText = "The name that should be used for named builds and the mac app bundle instead of the project's name")]
public string DisplayName { get; set; }
[Option('a', "build-args", HelpText = "Additional arguments that should be passed to the dotnet publish command")] [Option('a', "build-args", HelpText = "Additional arguments that should be passed to the dotnet publish command")]
public string BuildArgs { get; set; } public string BuildArgs { get; set; }

View file

@ -117,13 +117,29 @@ namespace GameBundle {
} }
private static void CreateMacBundle(Options options, DirectoryInfo dir, FileInfo proj) { private static void CreateMacBundle(Options options, DirectoryInfo dir, FileInfo proj) {
var app = dir.CreateSubdirectory($"{GetDisplayName(options, proj)}.app"); var files = dir.GetFiles();
var dirs = dir.GetDirectories();
// figure out the app name, which should match the binary (and dll) name
var appName = Path.GetFileNameWithoutExtension(proj.Name);
foreach (var file in files) {
if (!string.IsNullOrEmpty(file.Extension))
continue;
if (files.Any(f => f.Extension == ".dll" && Path.GetFileNameWithoutExtension(f.Name) == file.Name)) {
Console.WriteLine($"Choosing app name {file.Name} from binary");
appName = file.Name;
break;
}
}
var app = dir.CreateSubdirectory($"{appName}.app");
var contents = app.CreateSubdirectory("Contents"); var contents = app.CreateSubdirectory("Contents");
var resources = contents.CreateSubdirectory("Resources"); var resources = contents.CreateSubdirectory("Resources");
var macOs = contents.CreateSubdirectory("MacOS"); var macOs = contents.CreateSubdirectory("MacOS");
var resRegex = options.MacBundleResources.Select(GlobRegex).ToArray(); var resRegex = options.MacBundleResources.Select(GlobRegex).ToArray();
var ignoreRegex = options.MacBundleIgnore.Select(GlobRegex).ToArray(); var ignoreRegex = options.MacBundleIgnore.Select(GlobRegex).ToArray();
foreach (var file in dir.GetFiles()) {
foreach (var file in files) {
if (ignoreRegex.Any(r => r.IsMatch(file.Name))) if (ignoreRegex.Any(r => r.IsMatch(file.Name)))
continue; continue;
var destDir = resRegex.Any(r => r.IsMatch(file.Name)) ? resources : macOs; var destDir = resRegex.Any(r => r.IsMatch(file.Name)) ? resources : macOs;
@ -131,8 +147,8 @@ namespace GameBundle {
destDir = app; destDir = app;
file.MoveTo(Path.Combine(destDir.FullName, file.Name), true); file.MoveTo(Path.Combine(destDir.FullName, file.Name), true);
} }
foreach (var sub in dir.GetDirectories()) { foreach (var sub in dirs) {
if (sub.Name == app.Name || ignoreRegex.Any(r => r.IsMatch(sub.Name))) if (ignoreRegex.Any(r => r.IsMatch(sub.Name)))
continue; continue;
var destDir = resRegex.Any(r => r.IsMatch(sub.Name)) ? resources : macOs; var destDir = resRegex.Any(r => r.IsMatch(sub.Name)) ? resources : macOs;
var dest = new DirectoryInfo(Path.Combine(destDir.FullName, sub.Name)); var dest = new DirectoryInfo(Path.Combine(destDir.FullName, sub.Name));
@ -140,6 +156,7 @@ namespace GameBundle {
dest.Delete(true); dest.Delete(true);
sub.MoveTo(dest.FullName); sub.MoveTo(dest.FullName);
} }
File.WriteAllText(Path.Combine(contents.FullName, "PkgInfo"), "APPL????");
} }
private static Regex GlobRegex(string s) { private static Regex GlobRegex(string s) {
@ -149,13 +166,9 @@ namespace GameBundle {
private static string GetBuildDir(Options options, FileInfo proj, string osName) { private static string GetBuildDir(Options options, FileInfo proj, string osName) {
var dir = Path.GetFullPath(options.OutputDirectory); var dir = Path.GetFullPath(options.OutputDirectory);
if (options.NameBuilds) if (options.NameBuilds)
return $"{dir}/{GetDisplayName(options, proj)}-{osName}"; return $"{dir}/{Path.GetFileNameWithoutExtension(proj.Name)}-{osName}";
return $"{dir}/{osName}"; return $"{dir}/{osName}";
} }
private static string GetDisplayName(Options options, FileInfo proj) {
return string.IsNullOrEmpty(options.DisplayName) ? Path.GetFileNameWithoutExtension(proj.Name) : options.DisplayName;
}
} }
} }

View file

@ -1 +1 @@
"../GameBundle/bin/Debug/net5.0/GameBundle.exe" -wlm -bzn -s Test.csproj -o bin/Bundled -v -d "Test Project" --mac-bundle-ignore macmain.txt "../GameBundle/bin/Debug/net5.0/GameBundle.exe" -wlm -bzn -s Test.csproj -o bin/Bundled -v --mac-bundle-ignore macmain.txt

View file

@ -5,6 +5,7 @@
<TargetFramework>net5.0</TargetFramework> <TargetFramework>net5.0</TargetFramework>
<PublishReadyToRun>false</PublishReadyToRun> <PublishReadyToRun>false</PublishReadyToRun>
<TieredCompilation>false</TieredCompilation> <TieredCompilation>false</TieredCompilation>
<AssemblyName>Test Project</AssemblyName>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>