きりかノート 3冊め

おあそびプログラミング

RubyCocoa の .app コマンドラインツールでのオプション操作

bcscan にオプションを追加しようと、optparse でオプションを書いてみたら。

 % bcscan --mirrored 
/Users/kimuraw/build/Release/bcscan.app/Contents/MacOS/bcscan:
invalid option --mirrored (-h will show valid options)

と言われてしまう。あー、そうか。 RubyCocoa では RBApplicationMain() でオプションは Ruby 側に渡されちゃうんだよな。前もなんかで悩んだような気がする。ようするに、

 % MyApp.app/Contents/MacOS/MyApp -foo -bar baz
# -> ruby -foo -bar baz rb_main.rb

となるのだ。これはこれで便利なのだけど(-d とか -r とか)、独自のオプションを扱おうとすると上述のように Ruby 本体から「そんなオプション知らねーよ」と言われてしまう。しかたないので、main.m で

 int main(int argc, const char *argv[])
{
return RBApplicationMain("rb_main.rb", 1, argv); // argc -> 1
}

と、オプションを渡さないようにした上で、ruby スクリプト側で

 args = OSX::NSProcessInfo.processInfo.arguments.collect {|arg| arg.to_s}

と、NSProcessInfo から実際に渡されたオプションを取るようにした。

 % MyApp.app/Contents/MacOS/MyApp -foo -bar baz
# -> ruby rb_main.rb -foo -bar baz

となるような RBApplicationMain() の代替 APIRubyCocoa プロジェクトとして用意するといいのかな?