Doch, es geht, genau so

Ich habe zwar zig Anläufe gebraucht, AppleScript hat mir diverse graue Haare beschert, aber es läuft. Und das auch für andere Anwendungen, ohne dass man einen Mac braucht (außer man will signieren, klar).
Hier das was ich gemacht habe. Ich verwende [[[ ]]] als Platzhalter! Mehr dazu am Ende.
1. Loader App erstellen.
Der Universalität (und weil sie genau dies tut) habe ich sie "ShellExecute" genannt.
Muss auf Mac geschehen, ich lade den Loader aber in meinem Blog und hier etwas später noch hoch. Alles hier nach kann auch unter Windows oder Linux gemacht werden.
Apple Script öffnen und ein neues Script erstellen.
Code:
tell application "Terminal"
set current_path to POSIX path of ((path to me as text)) & "Contents/MacOS/"
activate
do script "cd " & current_path & " && chmod 744 ./ShellExecute.sh && ./ShellExecute.sh"
end tell
Hierfür eine App erstellen (auch das Script speichern, besser isses).
Was passiert?
Es wird ein Terminal geöffnet, der Pfad der aktuellen Datei ermittelt und das Terminal aktiviert.
Danach wird in das Verzeichnis der App gewechselt, das .sh Script bekommt Ausführungsrechte und wird gestartet.
2. App vorbereiten.
Apple Script will die Anwendung in der App immer "applet" nennen. Ich habe sie für mich umbenannt in "ShellExecute". Ich habe also "Contents/MacOS/applet" und "Contents/Resources/applet.rsrc" passend umbenannt. Den Ordner Scripts nicht anrühren, die Anderen Dateien hier drin können gelöscht werden. Kann man, muss man aber nicht. Wenn nicht: Nachher aufpassen beim Bearbeiten der .plist Datei!
3. Info.plist vorbereiten
Vom Prinzip ist die existierende schon ganz ok. Man möchte sie ja aber vielleicht noch etwas anpassen.
Hier ist meine. Vorsicht, sie ist als Template verfasst.
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleName</key>
<string>[[[APPNAME]]]</string>
<key>CFBundleDisplayName</key>
<string>[[[APPNAME]]]</string>
<key>CFBundleIdentifier</key>
<string>[[[IDENTIFIER]]]</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleExecutable</key>
<string>ShellExecute</string>
<key>CFBundleDocumentTypes</key>
<array/>
<key>CFBundleShortVersionString</key>
<string>[[[VERSION]]]</string>
<key>NSHumanReadableCopyright</key>
<string>[[[COPYRIGHT]]]</string>
<key>NSMainNubFile</key>
<string></string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIconFile</key>
<string>[[[APPNAME]]]</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>1.0.0.0</string>
<key>LSMinimumSystemVersionByArchitecture</key>
<dict>
<key>x86_64</key>
<string>10.6</string>
</dict>
<key>LSRequiresCarbon</key>
<true/>
<key>LSHasLocalizedDisplayName</key>
<false/>
</dict>
</plist>
4. ShellExecute.sh erstellen
Diese Datei wird von dem Apple Script ausgeführt und muss in Contents/MacOS liegen.
Der Inhalt kann frei definiert werden, allerdings ist er simpel.
Code:
#!/bin/sh
./[[[APPNAME]]]
exit
Was passiert? Es wird einfach die Binärdatei ausgeführt. Das exit danach ist gewollt aber nicht gekonnt, siehe Schlusswort.
5. Die App als Rohling speichern.
Diese App ist jetzt unvollständig und nicht lauffähig, sie dient uns aber als Rohling um weitere zu erstellen.
Alle obigen Schritte müssen ab jetzt nicht mehr wiederholt werden. Ausnahme: Codesigning.
6. Die App mit Inhalt versorgen
Eine Kopie des Rohlings erstellen (die spätere App) und passend benennen.
Ich gehe davon aus, dass die (in diesem Fall .Net Core) Konsolenanwendung bereits für macos-x64 kompiliert und veröffentlicht wurde.
Den Inhalt des .Net publish Ordners kopieren und im App Verzeichnis unter Contents/MacOS einfügen.
7. Die App fertigstellen
Erstellt ein Icon für die App, für MacOS scheint das .icns Format gewünscht. Gibt viele Programme die diese erstellen / umwandeln können, ich hatte
Photoline verwendet. Das kommt unter /Contents/Resources/[[[APPNAME]]].icns
Jetzt müssen nur noch die Dateien /Contents/info.plist und /Contents/MacOS/ShellExecute.sh bearbeitet werden.
Hat man meine Platzhalter verwendet reicht ein simples suchen - ersetzen im Texteditor oder in einem Script / Programm, falls es automatisiert werden soll.
Hier die Platzhalter die zu ersetzen sind:
[[[APPNAME]]] = der Name der Anwendung, gleichzeitig der Name der Startdatei (MyApp)
[[[IDENTIFIER]]] = der eindeutige Identifizierer (net.example.myapp)
[[[VERSION]]] = Die Versionsnummer der App (1.0.0)
[[[COPYRIGHT]]] = Das Copyright (Copyright © 2019 example.com)
8. Testen.
Ich kann jetzt nur für mich sprechen, aber bei mir klappte es bei mehreren Testprojekten jedes Mal auf Anhieb.
Bestimmt lässt sich hier und da noch was optimieren, wie gesagt, MacOS ist in dem Bereich für mich noch neu.
Aber es läuft. Einziger kleiner Schönheitsfehler: Beendet sich die Anwendung bleibt die Konsole offen. Kann ich mit leben.
Auf jeden Fall vielen Dank für die Hilfe, auch wenn es "nur" das Umbiegen meiner Gedanken war
