Jak utworzyć aplikację OSX, aby zawrzeć wywołanie skryptu powłoki?

10

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.shale 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:

program automatyzujący applecript

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:

witamy w 2015 roku

No dalej, to powinno być całkiem proste. Co robię tutaj źle?

emptyset
źródło
Cóż, właśnie opublikowałem aktualizację z prostszym skryptem jabłkowym, ale przekonaj się, że zostałem pobity przez odpowiedź, która powinna działać lepiej dla Ciebie przez Grgarside. :-)
markhunte
Tytuł tego pytania nie odzwierciedla rzeczywistego pytania, dlatego głosowałem w dół. Pytanie jest węższe: chodzi o rozwiązanie problemu z komunikatem o błędzie „Aplikacje PowerPC nie są już obsługiwane” i tak powinno być w tytule pytania. Tak naprawdę szukam odpowiedzi na pytanie, jak utworzyć pakiet aplikacji. OP wie, jak utworzyć pakiet, ale napotkał błąd.
Jason

Odpowiedzi:

4

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:

cd "$(dirname $BASH_SOURCE)"
grg
źródło
7

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.

wprowadź opis zdjęcia tutaj

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.

wprowadź opis zdjęcia tutaj

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.

on run {input, parameters}
    tell application "Finder"
        set current_path to container of (path to me) as alias
    end tell

    do shell script "cd " & quoted form of (POSIX path of current_path) & " ;ls | open -fe"

    return input
end run 

W moim przykładzie

do shell script "cd " & quoted form of (POSIX path of current_path) & " ;/bin/ls | /usr/bin/open -fe"

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;

do shell script "cd " & quoted form of (POSIX path of current_path) & " ;\"java -jar app.jar\""

aktualizacja:

Innym sposobem jest użycie czystego Applescript.

on run {input, parameters}
    tell application "Finder"
        set current_path to container of (path to me)

        set theFile to (current_path) as alias

        open file "java -jar app.jar" of theFile
    end tell


end run
markhunte
źródło
Jest to bardzo zbliżone do rozwiązania; Potwierdzam, że ls | openkod zdecydowanie otwiera żądany katalog, co jest świetne. Ale kiedy dzwonię open Client.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 +xustawiono flagi. Próbowałem również tego i to nie działało (z tym samym błędem).
emptyset
Pamiętaj, że otwarcie Client.appz Findera (dwukrotne kliknięcie) powoduje również wyświetlenie tego samego wyskakującego błędu PowerPC.
emptyset
@emptyset I call open Client.appCzy 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żywasz openpolecenia? o ile rozumiem, co robisz, nie musisz tego używać. Klienci będą korzystać z podwójnego kliknięcia aplikacji, a aplikacja uruchomi java
markhunte
Przetestowałem to na dwa sposoby: z linii poleceń: $ open Client.appi klikając dwukrotnie. Twoja wersja z wywoływaniem ls | open -fedziała, ale kiedy zmienię ją na java -jar app.jar, daje mi ten błąd.
emptyset
@emptyset trydo shell script "cd " & quoted form of (POSIX path of current_path) & " ; " & quoted form of "java -jar app.jar"
markhunte
6

Ś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:

do shell script "cd " & quoted form of (POSIX path of file_path) & " && java -jar app.jar"

To &&jest ważne. Jeśli się cdpowiedzie, javapolecenie zostanie uruchomione w prawym cwd . Jeśli się cdnie powiedzie, javapolecenie nie zostanie uruchomione.

Problemy, które najprawdopodobniej napotkasz obejmują:

  • ucieczka od ścieżki POSIX przekazanej do cd; użytkownicy będą mieli dziwnie nazwane foldery i spacje na swoich ścieżkach.
  • cdustał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.

#!/usr/bin/env perl

use strict;
use warnings;
use FindBin qw($Bin); # $Bin is a path to the script's parent folder

`cd "$Bin" && java -jar app.jar`;

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 .

#!/bin/bash

if [ "$1" = "-h" -o "$1" = "--help" -o -z "$1" ]; then cat <<EOF
appify v3.0.1 for Mac OS X - http://mths.be/appify
Creates the simplest possible Mac app from a shell script.
Appify takes a shell script as its first argument:
    `basename "$0"` my-script.sh
Note that you cannot rename appified apps. If you want to give your app
a custom name, use the second argument:
    `basename "$0"` my-script.sh "My App"
Copyright (c) Thomas Aylott <http://subtlegradient.com/>
Modified by Mathias Bynens <http://mathiasbynens.be/>
EOF
exit; fi

APPNAME=${2:-$(basename "$1" ".sh")}
DIR="$APPNAME.app/Contents/MacOS"

if [ -a "$APPNAME.app" ]; then
    echo "$PWD/$APPNAME.app already exists :("
    exit 1
fi

mkdir -p "$DIR"
cp "$1" "$DIR/$APPNAME"
chmod +x "$DIR/$APPNAME"

echo "$PWD/$APPNAME.app"

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 codesignpolecenia:

codesign -s <identity> -v <code-path> 

Podpisywanie kodu to technologia bezpieczeństwa używana w systemie OS X, która umożliwia poświadczenie, że aplikacja została utworzona przez Ciebie. Po podpisaniu aplikacji system może wykryć każdą zmianę w aplikacji - niezależnie od tego, czy zmiana została wprowadzona przypadkowo, czy przez złośliwy kod.

Dowiedz się więcej o podpisywaniu kodu w witrynie Apple Developer.

Graham Miln
źródło
Dzięki za wskazówkę dotyczącą podpisywania kodu; Patrzę na to teraz i testuję skrypt appify!
emptyset
skrypt appify nie działał; ten sam problem ze ścieżką
emptyset
@emptyset Dodałem ścieżkę i sekcję perla. Warto również rozdzielić problem ścieżki na nowe pytanie. Jeśli możesz to naprawić, możesz użyć Automatora lub skryptu appify.
Graham Miln,
5

Użyj Platypus : „Platypus to narzędzie programistyczne OS X, które tworzy natywne aplikacje Mac z interpretowanych skryptów ...”

Platypus to narzędzie programistyczne OS X, które tworzy natywne aplikacje Mac z interpretowanych skryptów

perfectcu.be
źródło
4

Można zmienić run.sh, aby run.commandi uzyskać użytkownika do kliknij go dwukrotnie?

forquare
źródło
To prawie działało! Jednak uruchomił plik z kontekstu katalogu domowego użytkownika ( cd ~), co spowodowało jego awarię.
emptyset
1
@emptyset Użyj $ BASH_SOURCE, patrz apple.stackexchange.com/a/201482
grg
1

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.

#
# STEP 1: locate and confirm zip file exists
#
#   This is long winded on purpose. It is meant to save the user some scrolling and 
#   and a click... Isn't this what computers are for to save time? :)
#

# Zip file name 
set zipname to "Deliverable.zip"

# Locate the zip file
set zippath to POSIX path of (choose folder)
log zippath
set qzippath to quoted form of zippath
log qzippath
set zipfile to (zippath & zipname)
set qzipfile to quoted form of (zippath & zipname)
log qzipfile

# Check for the file... Use either test not both :)
try
    # using shell test - case sensetive
    do shell script "test -f " & qzipfile

    # using native test - doesn't like quoted forms and case insensetive...
    POSIX file zipfile as alias
on error
    display dialog "ERROR: Zip file was not found at selected folder." as text ¬
        buttons {"OK"} with icon caution ¬
        with title "Alert"
    return
end try


#
# STEP 2: Zip found. Unzip it
#
try
    # Add " -d Deliverable" at the end to force directory  
    # unzip -o to force overwrite for testing....
    do shell script "cd " & qzippath & "; unzip -o " & zipname
on error eStr
    display dialog "ERROR: Failed to unzip file. Message returned was, " & ¬
        return & return & eStr as text ¬
        buttons {"OK"} with icon caution ¬
        with title "Unzip Error"
    return
end try


#
# STEP 3: Run script 
#
set dpath to (zippath & "Deliverable/")
log dpath
set qdpath to quoted form of dpath
log qdpath
try
    do shell script "cd " & qdpath & ";  sh ./run.sh"
on error eStr
    display dialog "ERROR: Failed to launch script. Message returned was, " & ¬
        return & return & eStr as text ¬
        buttons {"OK"} with icon caution ¬
        with title "Deliverable Script Launch"
    return
end try
Vic
źródło