Bagaimana cara membuat Aplikasi OSX untuk membungkus panggilan ke skrip shell?


10

Tujuan saya adalah untuk memasukkan dalam file zip apa yang merupakan jalan pintas, daripada memberi tahu pelanggan saya untuk membuka Terminal dan menjalankan skrip shell.

Pada dasarnya saya bisa digunakan seperti ini:

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

Script dalam run.sh:

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

Ada banyak lagi di direktori; Cukuplah untuk mengatakan saya perlu menjalankan skrip dari direktori Deliverable karena saya perlu mengakses jalur relatif terhadapnya. Namun, saya tidak dapat menjamin di mana pelanggan akan membuka Deliverable.zip(bisa direktori home, bisa langsung di direktori Downloads, dll.)

Saya menemukan ini yang menjelaskan cara membuat alur kerja baru di Automator, lalu simpan sebagai aplikasi untuk meluncurkan skrip shell. Saya mencoba melakukan itu untuk membungkus run.shtetapi katanya tidak dapat menemukan run.sh.

Seseorang menyarankan saya menggunakan applescript dan juga mengirimi saya tautan bagaimana cara menggunakan applescript untuk beralih ke direktori saat ini; ada "aksi" applescript di automator; jadi saya membuat alur kerja baru dengan itu, dan menyimpannya sebagai aplikasi. Seperti inilah tampilannya:

program applescript automator

Kode:

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

Dan ini adalah kesalahan yang saya dapatkan ketika saya menjalankannya:

selamat datang di 2015

Ayo, ini seharusnya cukup sederhana. Apa yang saya lakukan salah di sini?


Yah saya baru saja memposting pembaruan dengan applescript yang lebih sederhana, tetapi saya dipukuli dengan jawaban yang seharusnya lebih baik untuk Anda oleh grgarside. :-)
markhunte

Judul pertanyaan ini tidak mewakili pertanyaan yang sebenarnya, jadi saya memilih. Pertanyaannya lebih sempit: ini tentang menyelesaikan masalah dengan pesan kesalahan "Aplikasi PowerPC tidak lagi didukung" dan inilah yang seharusnya ada dalam judul pertanyaan. Saya sebenarnya mencari jawaban untuk cara membuat bundel aplikasi. OP tahu cara membuat bundel tetapi mengalami kesalahan.
Jason

Jawaban:


4

Ganti nama file .sh Anda menjadi .command dan Anda dapat melakukan cd ke direktori di mana file .command berada di bawah ini di awal file:

cd "$(dirname $BASH_SOURCE)"

7

Saya dapat melihat beberapa hal yang salah di sana.

Pertama, Anda telah membuka alur kerja dan bukan Aplikasi.

Anda harus memilih Aplikasi ketika Anda menentukan pilihan untuk jenis file Automator.

masukkan deskripsi gambar di sini

Dan kode yang Anda miliki tidak akan berfungsi seperti yang Anda harapkan, karena Anda belum mengubah direktori. (CD).

Dalam kode seperti yang Anda miliki, semua yang dilakukannya adalah mendapatkan path sebagai alias dan menyimpannya dalam variabel current_path dan dalam format yang tidak cocok untuk perintah unix.

Tetapi Anda tidak menggunakannya.

Jadi direktori saat ini kemungkinan besar akan menjadi folder rumah Anda

Pada tahap ini tidak ada yang tahu apa yang ingin diluncurkan.

Jika saya menjalankannya seperti yang Anda miliki saya dapatkan.

masukkan deskripsi gambar di sini

Yang masuk akal karena saya tidak menginstal Java. Tetapi jika saya melakukannya saya tidak akan berharap untuk menemukan file yang tepat.

Applescript harus terlihat seperti ini.

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 

Dalam contoh saya

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

Saya cd ke jalur POSIX alias di variabel current_path

yaitu dari "alias" Macintosh HD: Aplikasi: "" ke "/ Aplikasi /"

The quoted form of lolos jalur menggunakan tanda kutip.

Saya telah menggunakan perintah / bin / ls dan pipa ke terbuka di stdin TextEdit sebagai demonstrasi di sini sehingga Anda dapat menguji untuk melihat apakah Anda mendapatkan ke daerah yang Anda harapkan.

Anda akan menggunakan sesuatu seperti;

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

memperbarui:

Cara lain hanya menggunakan Applescript murni.

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

Ini sangat dekat dengan solusi; Saya mengkonfirmasi ls | openkode pasti membuka direktori yang saya inginkan, yang hebat. Tetapi ketika saya menelepon terbuka Client.app, saya mendapatkan: LSOpenURLsWithRole() failed with error -10665 for the file <path-to-Client.app> - beberapa pencarian untuk apa kesalahan ini berarti menyarankan masalah izin, saya memeriksa dan +xbendera ditetapkan. Saya juga mencoba ini , dan itu tidak berhasil (dengan kesalahan yang sama).
emptyset

Perhatikan bahwa membuka Client.appdari Finder (klik dua kali) juga menghasilkan pop-up kesalahan PowerPC yang sama.
emptyset

@emptyset I call open Client.appApakah ini aplikasi Automator. Dari apa yang saya mengerti di automator Anda memiliki kode applescript: do shell script "cd " & quoted form of (POSIX path of current_path) & " ;\"java -jar app.jar\"". Jadi di mana Anda menggunakan openperintah? yang sejauh yang saya mengerti apa yang Anda lakukan, Anda tidak perlu menggunakannya. Klien akan menggunakan klik dua kali pada aplikasi dan aplikasi akan menjalankan java
markhunte

Saya mengujinya dengan dua cara: dari baris perintah: $ open Client.appdan dengan mengklik dua kali. Versi Anda dengan memanggil ls | open -feberfungsi, tetapi ketika saya mengubahnya untuk java -jar app.jaritu memberi saya kesalahan itu.
emptyset

@emptyset trydo shell script "cd " & quoted form of (POSIX path of current_path) & " ; " & quoted form of "java -jar app.jar"
markhunte

6

Path to Script

Di AppleScript Anda, Anda perlu mengubah direktori kerja saat ini (cwd) sebelum mengeluarkan perintah java. Lakukan ini dengan garis AppleScript seperti:

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

Itu &&penting. Jika cdberhasil, javaperintah akan diluncurkan dalam cwd kanan . Jika cdgagal, javaperintah tidak akan dijalankan.

Masalah yang kemungkinan akan Anda temui meliputi:

  • melarikan diri dari jalur POSIX yang dilewati ke cd; pengguna akan memiliki aneh nama folder dan spasi di jalur mereka.
  • yang cdmungkin gagal; bungkus AppleScript Anda dalam blok coba untuk menangkap beberapa kesalahan dan memperingatkan pengguna.

perl

Secara pribadi, saya akan membungkus menggunakan skrip perl pendek sebagai pengganti skrip 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`;

Ada banyak cara yang lebih baik untuk menulis potongan perl ini tetapi ini harus bekerja.

Aplikasi Pengotomasi

Pendekatan terbaik adalah mengatasi masalah dengan pendekatan Automator Anda. Jawaban @ markhunte membahas cara memperbaiki jalur dan membuat aplikasi . Ini seharusnya membantu Anda.

Juga lihat jalur AppleScript relatif terhadap lokasi skrip .

appify - buat aplikasi Mac sesederhana mungkin dari skrip shell

Atau, Anda dapat menggunakan skrip appify Thomas Aylott untuk menggabungkan skrip shell Anda ke dalam aplikasi OS X. Artikel Mathias Bynen membahas cara menggunakan skrip, cara membuat aplikasi Mac sederhana dari skrip shell .

#!/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"

Peningkatan yang disumbangkan komunitas untuk skrip ini tersedia:

Penandatanganan Kode

Setelah Anda membuat bundel aplikasi Anda, itu harus ditandatangani kode. Aplikasi bertanda kode akan diluncurkan tanpa mengharuskan klien Anda menonaktifkan Gatekeeper.

Tanda tangani aplikasi Anda menggunakan ID Pengembang Apple Anda dan codesignperintah:

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

Penandatanganan kode adalah teknologi keamanan, yang digunakan dalam OS X, yang memungkinkan Anda memastikan bahwa aplikasi dibuat oleh Anda. Setelah aplikasi ditandatangani, sistem dapat mendeteksi perubahan apa pun pada aplikasi — apakah perubahan tersebut dilakukan secara tidak sengaja atau oleh kode berbahaya.

Pelajari lebih lanjut tentang penandatanganan kode di situs Pengembang Apple.


Terima kasih atas tip tentang penandatanganan kode; Saya melihat itu sekarang dan menguji skrip appify!
emptyset

skrip appify tidak berfungsi; masalah jalur yang sama
emptyset

@emptyset Saya telah menambahkan bagian jalur dan perl. Mungkin juga ada baiknya memisahkan masalah jalur menjadi pertanyaan baru. Jika Anda dapat memperbaikinya, Anda dapat menggunakan Automator atau skrip appify.
Graham Miln


4

Anda dapat mengubah run.shke run.commanddan mendapatkan pengguna untuk klik dua kali itu?


Itu hampir berhasil! Namun, ia menjalankan file dari konteks direktori home pengguna ( cd ~), yang menyebabkannya gagal.
emptyset

1
@emptyset Gunakan $ BASH_SOURCE, lihat apple.stackexchange.com/a/201482
grg

1

Inilah pendapat saya tentang apa yang saya pahami sedang Anda coba capai. Kode ini sengaja dibuat panjang lebar.

Yang perlu Anda lakukan adalah menyalin kode ke Editor Applescript, buat perubahan apa pun yang Anda inginkan dan simpan sebagai aplikasi.

Adapun dialog tentang aplikasi PowerPC tidak didukung, saya tidak tahu. Bisakah Anda menjalankannya dari baris perintah? Saya akan memeriksa untuk mengonfirmasi aplikasi berfungsi terlebih dahulu.

#
# 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.