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() の代替 API を RubyCocoa プロジェクトとして用意するといいのかな?