[REALbasic]REALbasicでシェルコマンドのフロントエンドを作る
REALbasicで、シェルコマンドのフロントエンドを作りたい。なおかつ、システムにデフォルトでは存在しないコマンドなので、そのシェルコマンドもバイナリの中にバンドルしたいと思って以前2ちゃんねるで聞いてみたところ、「できない」というのがその場での結論だった。
しかし、その後方法を見つけた(みんな知っているの?)ので書いておこう。そういうニッチなことを簡単に解説しているサイトも日本には無いようだし。
REALbasicは、Mac OS Xにおいて、ビルドするバイナリの形式をいろいろ選べる。
Mac OS Xのみ互換のMach-O形式を指定すると、例の拡張子が.appのパッケージの形態を取ることになる。
.appの実態はフォルダなので、中に簡単にバンドルするファイルを入れておくことができる。
ここまで分かれば、後はやることが決まったも同然だ。
dim f as folderItem
dim a as new application
dim s as new shell//実行ファイルの参照を取得
//(MyApplication.app:Contents:MacOS:MyApplication)
f = a.executableFile//実行ファイルがあるフォルダの参照を取得
//(MyApplication.app:Contents:MacOS)
f = getfolderItem(f.absolutePath).parent//実行ファイルがあるフォルダのPOSIXパスを取得。
//さらにバンドルしたシェルコマンドまでのパスを末尾に結合し、
//(MyApplication.app/Contents/MacOS/unison)
//実行する。
s.execute(f.shellPath + "/unison")//コマンドからの標準出力を取得
editField1.text = s.result
こんなコードを書いてビルド。できたアプリケーションをControl + Clickして「パッケージの内容を表示」。
Contents、MacOSとフォルダをたどって、そこに(MacOSフォルダの中に)シェルコマンドを入れておく(例ではunison)。
このShellPathというFolderItemのプロパティはマニュアルに無いんだけど、何なんだろう? AppleScriptの「POSIX path of 」みたいなのを探して、外人が使っているのを見て初めて知った。
このほか、マニュアルに記載の無いFolderItemのプロパティにPathTypeShellというのがあるけど、これは/shallow/deep/destfileという形式で与えられた引数をFolderItemとして扱うためのもののようだ。コンソールアプリを作るときに役に立つ。ちょっと話がそれた。
http://rbgazette.com/?p=238
後はこれの応用だけど、困るのはデバッグ。
ただ単にシェルコマンドをプロジェクトウインドウに放り込んでおくだけでは、Resourcesフォルダにリソースとして保存されてしまう。リソースをシェルコマンドとして実行するメソッドは無いようだ。
こうなると、ビルドの度にMyApplication.debug/Contents/MacOSフォルダの中にシェルコマンドをコピーしてやらないといけない。そのこと自体はシェルスクリプトを組むなり何なりで自動化は可能だけど、ほかに方法があるのではと思う次第。
TrackBack
TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/13760/5431331
Listed below are links to weblogs that reference [REALbasic]REALbasicでシェルコマンドのフロントエンドを作る:

Comments
とても古い記事へのコメントで申し訳ありません。REALbasicでシェルコマンドのフロントエンドを作る やってみました!!
確かに、めんどくさい面もありますが、とてもGOODです。
初心者で教えていただきたいんですが、バンドルするファイルにREALBasicからパラメーターを送る事は可能でしょうか?
宜しくお願いします。
Posted by: michipo | 2008.08.06 at 07:29 PM
s.execute(f.shellPath + "/unison --option target")
普通にexecuteの引数に足してやればOKですよ。
非同期で動かしたプロセスとの通信についてはReference ManualのShell.Mode辺りを見てください。
DataAvailableイベント経由で標準出力を見て、こういったメッセージが出力されたらこのキーを送る、といったことができたはずです。
Posted by: moyashi | 2008.08.06 at 08:22 PM
コメントありがとうございます。
なんか使える範囲が広がりましたーーー。
ありがとうございます。
Posted by: michipo | 2008.08.07 at 09:17 AM