rubyscript2exeの困りごと

$0がrubyscript2exeの内部処理で生成される環境に展開される。例えばC:\DOCUME~1\jitte\LOCALS~1\Temp\eee.app3.exe.2\app\app3.rbとか。同じバイナリだけどファイル名が違うと別の動作、のようなUNIX系常套手段を安易にやろうとするとハマる可能性あり。あと単にUsageを出力するときに$0を使いたかったりするし。そういうときはFile.basename($0, '.*')とかしてやる必要があるようだ。まあ、これは回避できるからまだいい。

文字コードはもっとややこしい場合がある。JIS_1 = /[亜-腕]/のようにマルチバイトコード正規表現に含めたいとする(というか、先日そういうスクリプトを書いて判明した)。当然RUBYOPTかshebangに-Ksをつける必要があるが、rubyscript2exeはどうやらshebangを読んでくれないらしく、コンパイルできない。一方、RUBYOPTだとコンパイルは通るが、結局実行時にエラーを起こす。ということで、このプログラムはrubyscript2exeではコンパイルできない。Exerbの場合は-ksjisオプションをつければ問題ない。

また、ActiveRecordでociアダプタを使っているときに、スクリプト自体は問題なく動作していたのにコンパイルすると実行時にエラーとなる現象が発生した。Oracleのエラー番号を調べると環境変数NLS_LANGが不正とのことだったので、事前に環境変数を設定してやると動くようになった(スクリプト内で設定する場合はActiveRecodeを読み込む前に設定する必要あり)。

後者2つの例から推測するとどうもrubyscript2exeで参照される環境が怪しいのではないか(でもENVを表示するとちゃんと入っているぽいのが理解できない)、と思われるのだがこの先を調査するのは厳しいのであきらめ中。

とかくとrubyscript2exeだめじゃん!と思われそうだけどExerbの困りごとで書いたようにどっちもどっちなので両方うまく使い分けしているのが現状、という話。

追記:たぶん回避できる方法 → rubyscript2exeでshebangに-Ksを付ける方法