Moim celem jest dołączenie do pliku zip, co stanowi skrót, zamiast informować moich klientów, aby otworzyli Terminal i uruchomili skrypt powłoki.
Moje urządzenie do wdrożenia wygląda następująco:
$ unzip Deliverable.zip
$ cd Deliverable; ls
app.jar run.sh
Skrypt w run.sh
:
#!/bin/sh
java -jar app.jar
W katalogu jest o wiele więcej; wystarczy powiedzieć, że muszę uruchomić skrypt z katalogu Deliverable, ponieważ muszę uzyskać dostęp do ścieżek względem niego. Nie mogę jednak zagwarantować, gdzie klient zamierza otworzyć Deliverable.zip
(może to być katalog domowy, może znajdować się bezpośrednio w katalogu Pobrane itp.)
Znalazłem to, które opisuje, jak utworzyć nowy przepływ pracy w Automatorze, a następnie zapisać go jako aplikację do uruchomienia skryptu powłoki. Próbowałem to zrobić, run.sh
ale nie można tego znaleźć run.sh
.
Ktoś zasugerował, że używam AppleScript, a także wysłał mi link do sposobu korzystania z Applecript do przejścia do bieżącego katalogu; w automatorze znajduje się „akcja” jabłkowego skryptu; więc stworzyłem nowy przepływ pracy i zapisałem go jako aplikację. Tak to wygląda:
Kod:
on run {input, parameters}
tell application "Finder"
set current_path to container of (path to me) as alias
end tell
do shell script "java -jar app.jar"
return input
end run
I to jest błąd, który pojawia się, gdy go uruchamiam:
No dalej, to powinno być całkiem proste. Co robię tutaj źle?
źródło
Odpowiedzi:
Zmień nazwę pliku .sh na .command i możesz przejść do katalogu, w którym znajduje się plik .command, z następującymi elementami na początku pliku:
źródło
Widzę tam kilka rzeczy źle.
Po pierwsze, otworzyłeś przepływ pracy, a nie aplikację.
Po dokonaniu wyboru typu pliku Automatora należy wybrać opcję Aplikacja.
A kod, który posiadasz, nie będzie działał zgodnie z oczekiwaniami, ponieważ nie zmieniłeś katalogu. (Płyta CD).
W kodzie, jaki masz, wystarczy pobrać ścieżkę jako alias i przechowywać ją w zmiennej current_path oraz w formacie nieodpowiednim dla komend unixowych.
Ale nie korzystasz z niego.
Zatem bieżący katalog najprawdopodobniej będzie twoim folderem domowym
Na tym etapie nie wiadomo, co próbuje uruchomić.
Jeśli uruchomię to tak, jak ty to masz.
Ma to sens, ponieważ nie mam zainstalowanej Java. Ale gdybym to zrobił, nie spodziewałbym się, że znajdzie odpowiedni plik.
Applescript musi wyglądać tak.
W moim przykładzie
I cd do ścieżki POSIX aliasu w zmiennej current_path
tzn. z „aliasu” Macintosh HD: Aplikacje: „” na „/ Aplikacje /”
quoted form of
Ucieka ścieżkę używając cytatów.Użyłem polecenia / bin / ls i potokowałem go na otwartej przestrzeni w TextEdit stdin jako demonstrację tutaj, abyś mógł przetestować, czy przechodzisz do oczekiwanego obszaru.
Użyłbyś czegoś takiego;
aktualizacja:
Innym sposobem jest użycie czystego Applescript.
źródło
ls | open
kod zdecydowanie otwiera żądany katalog, co jest świetne. Ale kiedy dzwonię openClient.app
, otrzymuję:LSOpenURLsWithRole() failed with error -10665 for the file <path-to-Client.app>
- kilka wyszukiwań, co oznacza ten błąd, sugeruje problem z uprawnieniami, sprawdziłem i+x
ustawiono flagi. Próbowałem również tego i to nie działało (z tym samym błędem).Client.app
z Findera (dwukrotne kliknięcie) powoduje również wyświetlenie tego samego wyskakującego błędu PowerPC.I call open Client.app
Czy to aplikacja Automator. Z tego co rozumiem w Automator masz kodu AppleScript:do shell script "cd " & quoted form of (POSIX path of current_path) & " ;\"java -jar app.jar\""
. Więc gdzie używaszopen
polecenia? o ile rozumiem, co robisz, nie musisz tego używać. Klienci będą korzystać z podwójnego kliknięcia aplikacji, a aplikacja uruchomi java$ open Client.app
i klikając dwukrotnie. Twoja wersja z wywoływaniemls | open -fe
działa, ale kiedy zmienię ją najava -jar app.jar
, daje mi ten błąd.do shell script "cd " & quoted form of (POSIX path of current_path) & " ; " & quoted form of "java -jar app.jar"
Ścieżka do skryptu
W swoim AppleScript musisz zmienić bieżący katalog roboczy (cwd) przed wydaniem polecenia java. Zrób to za pomocą linii AppleScript, takiej jak:
To
&&
jest ważne. Jeśli sięcd
powiedzie,java
polecenie zostanie uruchomione w prawym cwd . Jeśli sięcd
nie powiedzie,java
polecenie nie zostanie uruchomione.Problemy, które najprawdopodobniej napotkasz obejmują:
cd
; użytkownicy będą mieli dziwnie nazwane foldery i spacje na swoich ścieżkach.cd
ustała owinąć swój AppleScript w try bloku złapać jakieś błędy i ostrzega użytkownika.perl
Osobiście chciałbym użyć krótkiego skryptu perla zamiast skryptu bash.
Są znacznie lepsze sposoby na napisanie tego fragmentu perla, ale to powinno działać.
Aplikacja Automator
Najlepszym rozwiązaniem jest rozwiązanie problemów z podejściem Automator. Odpowiedź @ markhunte omawia, jak naprawić ścieżkę i utworzyć aplikację . To powinno ci pomóc.
Zobacz także ścieżkę AppleScript względem lokalizacji skryptu .
appify - utwórz najprostszą możliwą aplikację Mac ze skryptu powłoki
Alternatywnie możesz użyć skryptu appify Thomasa Aylotta, aby spakować skrypt powłoki do aplikacji OS X. Artykuł Mathiasa Bynena omawia sposób korzystania ze skryptu i tworzenia prostych aplikacji Mac ze skryptów powłoki .
Udoskonalenia tego skryptu udostępnione przez społeczność są dostępne:
Podpisywanie kodu
Po utworzeniu pakietu aplikacji powinien on zostać podpisany kodem. Aplikacja podpisana kodem uruchomi się bez wymagania od klientów wyłączenia Gatekeeper.
Podpisuj aplikację kodem przy użyciu identyfikatora programisty Apple i
codesign
polecenia:Dowiedz się więcej o podpisywaniu kodu w witrynie Apple Developer.
źródło
Użyj Platypus : „Platypus to narzędzie programistyczne OS X, które tworzy natywne aplikacje Mac z interpretowanych skryptów ...”
źródło
Można zmienić
run.sh
, abyrun.command
i uzyskać użytkownika do kliknij go dwukrotnie?źródło
cd ~
), co spowodowało jego awarię.Oto moje zdanie na temat tego, co zrozumiałem, że próbujesz osiągnąć. Kod jest celowo długi.
Wystarczy skopiować kod do edytora Applescript, wprowadzić dowolne zmiany i zapisać go jako aplikację.
Jeśli chodzi o okno dialogowe o nieobsługiwanej aplikacji PowerPC, nie wiem. Czy możesz uruchomić go z wiersza poleceń? Sprawdziłbym to, aby potwierdzić, że aplikacja działa najpierw.
źródło