Як створити додаток OSX для перенесення виклику на сценарій оболонки?

Моя мета полягає в тому, щоб включити в zip-файл те, що складається з ярлика, замість того, щоб повідомляти моїм клієнтам (-ам) відкрити термінал і запустити сценарій оболонки.

Моє розгортання фактично виглядає так:

$ unzip Deliverable.zip 
$ cd Deliverable; ls
app.jar run.sh

Сценарій у run.sh :

#!/bin/sh
java -jar app.jar

У каталозі є багато іншого; достатньо сказати, що мені потрібно запустити скрипт з каталогу Deliverable , оскільки мені потрібно отримати доступ до шляхів відносно нього. Однак я не можу гарантувати, що клієнт відкриє Deliverable.zip (може бути домашній каталог, він може знаходитися прямо в каталозі "Завантаження" тощо).

Знайдено це , яке описує, як створити новий робочий процес в Automator, а потім зберегти його як програму для запуску сценарію оболонки. Я намагався зробити це, щоб загорнути run.sh , але він каже, що він не може знайти run.sh .

Хтось запропонував мені скористатися applescript, а також надіслав мені посилання на те, як використовувати applescript для переходу до поточного каталогу; в автоматизаторі є "дія" на яблуках; тому я зробив новий робочий процес з цим і зберег його як програму. Це виглядає так:

the automator applescript program

Код:

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

І це помилка, яку я отримую, коли я запускаю її:

welcome to 2015

Хай, це має бути досить простим. Що я тут роблю неправильно?

10
Назва цього питання не є актуальним питанням, тому я проголосував. Питання є більш вузьким: це стосується вирішення проблеми з повідомленням про помилку "Програми PowerPC більше не підтримуються", і це має бути у заголовку питання. Я дійсно шукаю відповідь, як створити пакет додатків. ОП знає, як створити зв'язок, але виникла помилка.
додано Автор John Robinson, джерело
Ну, я тільки що опублікував оновлення з більш простим applescript, але бачу, я був побитий на удар з відповіддю, який повинен працювати краще для вас grgarside. :-)
додано Автор kalindi saxena, джерело

6 Відповіді

Я бачу там кілька речей.

По-перше, ви відкрили робочий процес, а не програму.

Після вибору типу файлу Automator слід вибрати програму.

enter image description here

А код у вас не працюватиме, як ви очікуєте, оскільки ви не змінили директорію. (cd).

У коді, як ви його маєте, все, що він робить, це отримати шлях як псевдонім і зберегти його в змінну current_path і у форматі, непридатному для команд unix.

Але ви не використовуєте його.

Таким чином, поточний каталог, швидше за все, буде вашою домашньою папкою

На цьому етапі не можна сказати, що він намагається запустити.

Якщо я запустити його, як ви це я отримую.

enter image description here

Що має сенс, оскільки у мене немає встановленої Java. Але якщо б я зробив, я б не очікував, що він знайде потрібний файл.

Яблучний знак потрібно виглядати так.

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 

У моєму прикладі

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

Я переходжу на POSIX-шлях псевдоніма в змінну current_path

i.e from "alias "Macintosh HD:Applications:"" to "/Applications/"

Цитований вигляд виводить шлях, використовуючи лапки.

Я скористався командою /bin/ls і надіслав її до відкритих в текстовому редакторі TextEdit як демонстрацію, щоб ви могли перевірити, чи ви потрапляєте в область Ви очікуєте.

Ви б використовували щось подібне;

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

оновлення:

Іншим способом є використання чистого яблука.

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
7
додано
@emptyset Я називаю відкритим Client.app Це додаток Automator. З того, що я розумію в автоматі, у вас є код applescript: робити скрипт оболонки "cd" & цитовану форму (шлях POSIX поточного_трата) & "; . Отже, де ви використовуєте команду open ? який, наскільки я розумію, що ви робите, вам не потрібно його використовувати. Клієнти будуть використовувати подвійний клік на додаток, і програма буде запускати java
додано Автор kalindi saxena, джерело
@emptyset спробуйте зробити скрипт оболонки "cd" & цитовану форму (шлях POSIX поточного_трата) & ";" і цитовану форму "java -jar app.jar"
додано Автор kalindi saxena, джерело
Це дуже близьке до рішення; Я підтверджую ls | Відкрити код безсумнівно відкриває потрібний каталог, який є великим. Але коли я викликаю open Client. для чого ця помилка запропонувала запит на дозвіл встановлені прапорці + x . Я також спробував це , і це не спрацювало (з такою ж помилкою).
додано Автор Purnendu K Dasgupta, джерело
Зверніть увагу, що відкриття Client.app з Finder (подвійне клацання) також призводить до появи спливаючої помилки PowerPC.
додано Автор Purnendu K Dasgupta, джерело
Я перевірив його в обох напрямках: з командного рядка: $ open Client.app і двічі клацнувши. Ваша версія з викликом ls | open -fe працює, але коли я змінюю його на java -jar app.jar , це дає мені цю помилку.
додано Автор Purnendu K Dasgupta, джерело

Шлях до сценарію

У вашому AppleScript потрібно змінити поточний робочий каталог (cwd) перед видачею команди java. Зробіть це за допомогою лінії AppleScript, наприклад:

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

The && is important. If the cd succeeds, the java command will be launched within the right cwd. If cd fails, the java command will not be run.

Проблеми, з якими ви, ймовірно, зіштовхуєтеся, включають:

  • видалення шляху POSIX, переданого до cd ; користувачі матимуть у своїх шляхах папки та пробіли, які незвично називаються.
  • cd може вийти з ладу; завершіть роботу свого AppleScript у блоці спробуйте , щоб виявити деякі помилки та попередити користувача.

perl

Особисто я б обернув короткий perl скрипт замість скрипта 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`;

Є набагато кращі способи написання цього фрагмента perl, але це має спрацювати.

Автоматизатор застосування

Найкращий підхід полягає в тому, щоб працювати через проблеми з підходом Automator. Відповідь @ markhunte обговорює, як виправити шлях і створити програму . Це повинно отримати вам більшу частину шляху.

Також див. Шлях AppleScript щодо розташування сценарію .

appify - створити найпростіший можливий додаток Mac з сценарію оболонки

Крім того, ви можете скористатися додаванням сценарію , щоб прив'язати сценарій оболонки до програми OS X. Стаття Матіаса Байнена простежує, як використовувати сценарій, як створити прості додатки Mac з сценаріїв оболонки .

#!/bin/bash

if [ "$1" = "-h" -o "$1" = "--help" -o -z "$1" ]; then cat <
Modified by Mathias Bynens 
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"

Доступні покращення цього сценарію спільнотою:

Підписання коду

Після створення пакета програм слід підписати код. Підписаний програмою додаток запускатиметься, не вимагаючи, щоб ваші клієнти вимикали Gatekeeper.

Код підписує вашу заявку за допомогою ідентифікатора розробника Apple і кодового коду команда:

codesign -s  -v 

Підписання коду is a security technology, used in OS X, that allows you to certify that an app was created by you. Once an app is signed, the system can detect any change to the app—whether the change is introduced accidentally or by malicious code.

Learn more about Підписання коду on the Apple Developer site.

5
додано
@emptyset Я додав шлях і розділ Perl. Також варто виділити проблему шляху на нове питання. Якщо ви можете це виправити, можна скористатися Automator або appify script.
додано Автор Ulrich Schwarz, джерело
Дякуємо за пораду щодо підписання коду; Я дивлюся на те, що зараз і тестування сценарію appify!
додано Автор Purnendu K Dasgupta, джерело
appify script не працював; Проблема ж шляху
додано Автор Purnendu K Dasgupta, джерело

Перейменуйте ваш файл .sh у команду .command, і ви можете перейти до каталогу, в якому знаходиться файл .command, з наступним на початку файлу:

cd "$(dirname $BASH_SOURCE)"
4
додано

Чи можете ви змінити run.sh на run.command і щоб користувач двічі натискав на нього?

4
додано
@emptyset Використовуйте $ BASH_SOURCE, див. apple.stackexchange.com/a/201482
додано Автор Pacerier, джерело
Це майже спрацювало! Проте файл виконувався з контексту домашнього каталогу користувача ( cd ~ ), що призвело до його помилки.
додано Автор Purnendu K Dasgupta, джерело
Це працює! Завдяки @grgarside!
додано Автор Purnendu K Dasgupta, джерело

Use Platypus: "Platypus is an OS X developer tool that creates native Mac applications from interpreted scripts..."

Platypus is an OS X developer tool that creates native Mac applications from interpreted scripts

3
додано

Ось мій погляд на те, що я зрозумів, що ви намагаєтеся досягти. Код довго розгортається навмисно.

Все, що вам потрібно зробити, це скопіювати код в редактор Applescript, внести будь-які зміни і зберегти його як програму.

Що стосується діалогового вікна програми PowerPC, що не підтримується, я не знаю. Чи можете ви запустити його з командного рядка? Я б перевірив, щоб підтвердити, що додаток працює першим.

#
# 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
1
додано