Laden...

App-Bundle für OS X erstellen: ShellScript wird unerwartet beendet

Letzter Beitrag vor 11 Jahren 5 Posts 1.243 Views
App-Bundle für OS X erstellen: ShellScript wird unerwartet beendet

Hallo!

Seit einiger Zeit versuche ich eine .Net-Anwendung auf OS X per Doppelklick zum Laufen zu bringen, aber scheitere im Wesentlichen am App-Bundle.
In Creating a Mac App Bundle for a GTK# Application wird an sich ganz gut beschrieben wie man das macht, nur funktioniert das ShellScript bei mir nicht. Zuerst werden einige Fehler angezeigt, die auf überflüssige Leerzeichen zurückzuführen sind, aber wenn ich die alle behebe kommt eine Fehlermeldung die mir sagt, dass das Script an einem unerwartetem Punkt vorbei ist.
Ich kenne mich leider über haupt nicht mit ShellScripts aus, also gestaltet sich das debuggen sehr schwierig.
Komisch ist auch, dass sich auf der Seite viele Leute dafür bedanken, aber niemand erwähnt, dass es nicht funktioniert..
Ich hoffe jemand kann mir da helfen.

Vielen Dank im Voraus!

Also ich habe vor einiger Zeit selbst ein erweitertes Shell-Script, das uA gleich das Mono-FW lädt und installiert, auf Basis dieses Posts gebastelt.
Starte das Shell-Script mal im Terminal und poste die Ausgabe bzw poste mal dein Shell-Script.

Danke für deine Antwort!

Ich habe das Script 1:1 übernommen und nur die Strings verändert, die verändert werden mussten (Programmname, Mono-Version).

Am Anfang wurden einige Syntax Errors ausgegeben (Syntax Error near...), die weg waren als ich alle Kommentare und überflüssigen Leerzeichen entfernt habe. Aber am Schluss kam dann eben die besagte Meldung. Den genauen Text weiß ich nicht mehr und kann es im Moment leider auch nicht noch einmal ausführen. Jedenfalls war es irgendwas mit "unexpected end of file".
Der Fehler tritt scheinbar sehr häufig auf, und heißt angeblich im Endeffekt nur, dass irgendwo im Script ein Fehler ist. Kann sogar ganz am Anfang sein.
Ich habe das Script mehrmals neu aus dem Post kopiert, aber immer mit dem gleichen Ergebnis. Also kann ich ausschließen, dass ich versehentlich irgendwas geändert habe was ich nicht andern sollte..

Edit:
Wenn ich das Script so ausführe

#!/bin/sh
 
#get the bundle's MacOS directory full path
DIR=$(cd "$(dirname "$0")"; pwd)
 
#change these values to match your app
EXE_PATH="$DIR\npsvosx.exe"
PROCESS_NAME=npsvosx
APPNAME="NPSV"
 
#set up environment
MONO_FRAMEWORK_PATH=/Library/Frameworks/Mono.framework/Versions/Current
export DYLD_FALLBACK_LIBRARY_PATH="$DIR:$MONO_FRAMEWORK_PATH/lib:/lib:/usr/lib"
export PATH="$MONO_FRAMEWORK_PATH/bin:$PATH"
 
#mono version check
REQUIRED_MAJOR=2
REQUIRED_MINOR=8
 
VERSION_TITLE="Cannot launch $APPNAME"
VERSION_MSG="$APPNAME requires the Mono Framework version $REQUIRED_MAJOR.$REQUIRED_MINOR or later."
DOWNLOAD_URL="http://www.go-mono.com/mono-downloads/download.html"
 
MONO_VERSION="$(mono --version | grep 'Mono JIT compiler version ' |  cut -f5 -d\ )"
MONO_VERSION_MAJOR="$(echo $MONO_VERSION | cut -f1 -d.)"
MONO_VERSION_MINOR="$(echo $MONO_VERSION | cut -f2 -d.)"
if [ -z "$MONO_VERSION" ] \
	|| [ $MONO_VERSION_MAJOR -lt $REQUIRED_MAJOR ] \
	|| [ $MONO_VERSION_MAJOR -eq $REQUIRED_MAJOR -a $MONO_VERSION_MINOR -lt $REQUIRED_MINOR ] 
then
	osascript \
	-e "set question to display dialog \"$VERSION_MSG\" with title \"$VERSION_TITLE\" buttons {\"Cancel\", \"Download...\"} default button 2" \
	-e "if button returned of question is equal to \"Download...\" then open location \"$DOWNLOAD_URL\""
	echo "$VERSION_TITLE"
	echo "$VERSION_MSG"
	exit 1
fi
 
#get an exec command that will work on the current OS version
OSX_VERSION=$(uname -r | cut -f1 -d.)
if [ $OSX_VERSION -lt 9 ]; then  # If OSX version is 10.4
	MONO_EXEC="exec mono"
else
	MONO_EXEC="exec -a \"$PROCESS_NAME\" mono"
fi
 
#create log file directory if it doesn't exist
LOG_FILE="$HOME/Library/Logs/$APPNAME/$APPNAME.log"
mkdir -p "`dirname \"$LOG_FILE\"`"
 
#run app using mono
$MONO_EXEC $MONO_OPTIONS "$EXE_PATH" $* 2>&1 1> "$LOG_FILE"

also an sich exakt wie es im Post steht, kommt bei mir die Meldung "bad interpreter: No such file or directory".
Soweit ich weiß ist das eben wegen den überflüssigen Leerzeichen.
Sobald ich die entfernt habe und der Fehler verschwindet, kommt die Meldung syntax error: unexpected end of file".
Das Script sieht dann so aus:

#!/bin/sh
DIR=$(cd "$(dirname "$0")"; pwd)
EXE_PATH="$DIR\npsvosx.exe"
PROCESS_NAME=npsvosx
APPNAME="NPSV"
MONO_FRAMEWORK_PATH=/Library/Frameworks/Mono.framework/Versions/Current
export DYLD_FALLBACK_LIBRARY_PATH="$DIR:$MONO_FRAMEWORK_PATH/lib:/lib:/usr/lib"
export PATH="$MONO_FRAMEWORK_PATH/bin:$PATH"
REQUIRED_MAJOR=2
REQUIRED_MINOR=8
VERSION_TITLE="Cannot launch $APPNAME"
VERSION_MSG="$APPNAME requires the Mono Framework version $REQUIRED_MAJOR.$REQUIRED_MINOR or later."
DOWNLOAD_URL="http://www.go-mono.com/mono-downloads/download.html"
MONO_VERSION="$(mono --version | grep 'Mono JIT compiler version ' |  cut -f5 -d\ )"
MONO_VERSION_MAJOR="$(echo $MONO_VERSION | cut -f1 -d.)"
MONO_VERSION_MINOR="$(echo $MONO_VERSION | cut -f2 -d.)"
if [ -z "$MONO_VERSION" ] \ || [ $MONO_VERSION_MAJOR -lt $REQUIRED_MAJOR ] \ || [ $MONO_VERSION_MAJOR -eq $REQUIRED_MAJOR -a $MONO_VERSION_MINOR -lt $REQUIRED_MINOR ] 
then
	osascript \
	-e "set question to display dialog \"$VERSION_MSG\" with title \"$VERSION_TITLE\" buttons {\"Cancel\", \"Download...\"} default button 2" \
	-e "if button returned of question is equal to \"Download...\" then open location \"$DOWNLOAD_URL\""
	echo "$VERSION_TITLE"
	echo "$VERSION_MSG"
	exit 1
fi
 
#get an exec command that will work on the current OS version
OSX_VERSION=$(uname -r | cut -f1 -d.)
if [ $OSX_VERSION -lt 9 ]; then  # If OSX version is 10.4
	MONO_EXEC="exec mono"
else
	MONO_EXEC="exec -a \"$PROCESS_NAME\" mono"
fi
 
#create log file directory if it doesn't exist
LOG_FILE="$HOME/Library/Logs/$APPNAME/$APPNAME.log"
mkdir -p "`dirname \"$LOG_FILE\"`"
 
#run app using mono
$MONO_EXEC $MONO_OPTIONS "$EXE_PATH" $* 2>&1 1> "$LOG_FILE"

Ich teste das morgen auf der Arbeit. Hab grad keinen MAC zur Hand.
Aber soweit ich mich erinnern kann musste ich keine Leerzeilen bzw Kommentare entfernen.

EDIT: Ich habe das Script eben getestet und das mit den Leerzeilen und Kommentaren funktioniert problemlos wenn ich eben npsvosx.exe durch meine ersetze.
Das Einzige was mir aufgefallen ist bzw ich geändert habe:

EXE_PATH="$DIR\npsvosx.exe"

Versuch mal einen Slash(/) anstatt des Backslash zu verwenden.

Auf welchem OSX hast du das getestet?
Hast du das Script vorher auch auf executeable gesetzt? chmod +x

Vielen Dank für deine Hilfe!

Das ist eigenartig.. Das mit dem Slash ist eine sehr gute Idee. Ist mir gar nicht aufgefallen..
Soweit ich weiß ist es das Snow Leopard..
Hab das Script vorher natürlich auf executable gesetzt. Weiß aber auch nicht genau ob es funktioniert hat, da weder eine Erfolgs- noch eine Fehlermeldung kommt. Aber ich denke, dass eine andere Fehlermeldung kommen würde wenn es daran liegen würde.
Werde es sobald ich zuhause bin gleich mal mit geändertem Slash versuchen.

Edit:
Hab es gerade versucht aber es hat leider nichts geändert.. Und ja, es ist Snow Leopard.

Edit2:
Bin gerade einen großen Schritt weiter gekommen. Hab in einem Post gelesen, dass sowas am Editor liegen kann. Hab daraufhin EditRocket runtergeladen und damit ist der Fehler wohl behoben. Es erscheinen zwar 2 Syntax Errors (Zeile 17 und 18), die im Endeffekt dann aber einfach übersprungen werden.
Dummerweise bekomme ich daraufhin eine TypeInitializationException, um die ich mich wohl noch kümmern muss bevor das Programm läuft. Aber daran solls nicht scheitern.
Nochmal danke für deine Hilfe!