2013/07/30(火) [n年前の日記]
#2 [ruby] Ocraでexe化しようとしてハマり始めたり
Ocra を使って Rubyスクリプトをexeファイルにしてみたのだけど。実行してみるとエラーが。
Rubyスクリプトと同じフォルダに置いてある外部ファイルを読み込んで処理をするところで、「そんなファイルは見つからねえよ」と言われる。エラーメッセージを眺めると、ユーザアカウントの作業用フォルダ以下に該当ファイルが無いぞ、と言われているようで。
Ocra で exe化したファイルを実行しようとした場合、exeに同梱されているファイル群を、一旦作業用フォルダに展開して、そこにある Rubyスクリプトを動かす仕組みだろうと想像するのだけど。その、同梱されるファイルの中に、スクリプトが読み込もうとする外部ファイルは含まれていないので、「んなファイル見つからねえよ」と言われるのだろうと。
解決策を検索してみたところ、いくつか策はありそうで。
_覚え書き: ocra による Ruby の EXE 化
_巳2已己のメモ帳 Ocraの豆知識 [環境変数:OCRA_EXECUTABLE 編]
それにしても、特に何もしなくても、Ocra で exe化したソレは、DXRubyで使う画像ファイルの類が読み込まれているのが不思議。前述の事例を鑑みると、画像ファイル群も同様に見つからないと言われそうなものだけど。DXRuby の側で、件の環境変数を覗いてパスを変更しつつ処理をしているんだろうか…?
Rubyスクリプトと同じフォルダに置いてある外部ファイルを読み込んで処理をするところで、「そんなファイルは見つからねえよ」と言われる。エラーメッセージを眺めると、ユーザアカウントの作業用フォルダ以下に該当ファイルが無いぞ、と言われているようで。
Ocra で exe化したファイルを実行しようとした場合、exeに同梱されているファイル群を、一旦作業用フォルダに展開して、そこにある Rubyスクリプトを動かす仕組みだろうと想像するのだけど。その、同梱されるファイルの中に、スクリプトが読み込もうとする外部ファイルは含まれていないので、「んなファイル見つからねえよ」と言われるのだろうと。
解決策を検索してみたところ、いくつか策はありそうで。
- Ocra で exe化する際に、読み込むべき外部ファイルも明示的に指定して、exeの中に一緒に同梱させる。ocra main.rb hoge.txt みたいな感じで列挙すればいいらしい。もちろん、書き換え等はできない。たぶん書き込んでも後で消えちゃう。
- Ocra で exe化されたexeを実行する際、環境変数 ENV['OCRA_EXECUTABLE'] に、Ocra で exe化したソレのパスが入っているので、その環境変数を使ってフォルダの場所を得て処理をする。
_覚え書き: ocra による Ruby の EXE 化
_巳2已己のメモ帳 Ocraの豆知識 [環境変数:OCRA_EXECUTABLE 編]
それにしても、特に何もしなくても、Ocra で exe化したソレは、DXRubyで使う画像ファイルの類が読み込まれているのが不思議。前述の事例を鑑みると、画像ファイル群も同様に見つからないと言われそうなものだけど。DXRuby の側で、件の環境変数を覗いてパスを変更しつつ処理をしているんだろうか…?
◎ __END__ と DATA についてもハマった。 :
Rubyスクリプトの最後のほうに「__END__」と書いてからその下にテキスト等を書けば、DATA.read(), DATA.each_line 等で読み込むことができるらしく。
であれば、前述の外部ファイルも、「__END__」以下に書いてしまえば…。と思ったけど甘かった。その状態にすると、「DATA」が使えない。
Rubyのドキュメントを眺めたら、どうも require で呼ばれた場合は、呼ばれた側のソースの一番下にある「__END__」以下は対象にならず、呼び出した側・実行しているスクリプトソースの中に「__END__」があることを期待して動くらしい。
であれば、前述の外部ファイルも、「__END__」以下に書いてしまえば…。と思ったけど甘かった。その状態にすると、「DATA」が使えない。
Rubyのドキュメントを眺めたら、どうも require で呼ばれた場合は、呼ばれた側のソースの一番下にある「__END__」以下は対象にならず、呼び出した側・実行しているスクリプトソースの中に「__END__」があることを期待して動くらしい。
[ ツッコむ ]
以上です。