RubyスクリプトをWindowsの.exeにコンパイルすることは可能ですか?私はどこでも検索し、次のことを試しました(RubyScript2EXE、Shoes、Crateはすべて死んでいるか放棄されているように見えました。 )::
クリーンなシステムからWindows7 Ultimate(64ビット)でRuby 1.8.7を使用しています:
私はこれを行うかなり単純なスクリプトを持っています:
require 'rubygems'
require 'watir'
browser = Watir::Browser.new
browser.goto 'http://slashdot.org'
Ocraを実行しても、エラーメッセージは表示されず、何も起こりません。
ocra --output test.exe test.rb
=== Loading script to check dependencies
Exerbは、rbcにコンパイルされるため、より優れたソリューションのように見えます。実際には、次のことを実行します。
Ruby -r exerb/mkexy test.rb
# Window pops up and after I close it it writes out test.exy
C:\Users\jonathan\dev\Citation>exerb test.exy
C:/Ruby187/lib/Ruby/site_Ruby/1.8/exerb/recipe.rb:146:in `add_file_entry': test.
exy: no such file -- C:/Ruby187/lib/Ruby/gems/1.8/gems/win32-api-1.4.8-x86-mingw32/lib/win32/Ruby18/win32/api.so (RuntimeError)
from C:/Ruby187/lib/Ruby/site_Ruby/1.8/exerb/recipe.rb:86:in `create_archive'
from C:/Ruby187/lib/Ruby/site_Ruby/1.8/exerb/recipe.rb:85:in `each'
from C:/Ruby187/lib/Ruby/site_Ruby/1.8/exerb/recipe.rb:85:in `create_archive'
from C:/Ruby187/bin/exerb.bat:67:in `main'
from C:/Ruby187/bin/exerb.bat:196
したがって、win32 /api.soが見つかりません。 C:/Ruby187/lib/Ruby/site_Ruby/1.8/exerb/recipe.rbを見ると、gemが検索パスにないように見えます。
DIR: C:/Users/jonathan/dev/Citation
DIR: C:/Ruby187/lib/Ruby/site_Ruby/1.8
DIR: C:/Ruby187/lib/Ruby/site_Ruby/1.8/i386-msvcrt
DIR: C:/Ruby187/lib/Ruby/site_Ruby
DIR: C:/Ruby187/lib/Ruby/vendor_Ruby/1.8
DIR: C:/Ruby187/lib/Ruby/vendor_Ruby/1.8/i386-msvcrt
DIR: C:/Ruby187/lib/Ruby/vendor_Ruby
DIR: C:/Ruby187/lib/Ruby/1.8
DIR: C:/Ruby187/lib/Ruby/1.8/i386-mingw32
DIR: .
ですから、調べてみると、次のようにexyファイルに検索パスを追加できることがわかりました。
path:
- C:/Ruby187/lib/Ruby/gems/
- C:/Ruby187/lib/Ruby/gems/1.8
- C:/Ruby187/lib/Ruby/gems/1.8/gems
この後、search_pathにこれらのパスが表示されますが、それでも同じエラーが発生します。明らかに、ルビジェムパスをexyに含める方法が必要ですか?
では、最近、誰かがWindowsで.exeをどのように作成するのでしょうか。
Exerbである程度の進歩を遂げましたが、-rrubygemsオプションを指定してmkexyを実行し、これを取り込むことができることがわかりました。これは、ほとんどのRubyプロジェクトでうまく機能します。いくつか試してみました。 Rubyさまざまなライブラリを問題なく使用するスクリプト。例:
mkexy -rrubygems test.rb
exerb test.exy
test.exe === WORKS!
残念ながら、それはwatirでは機能しません。 watirでビルドされた.exeを実行すると、次のようになります。
s4t-utils/claims.rb:24:in `user_is_bewildered': Error in the default values: :br
owserの値は、「safari」、「firefox」、または「ie」のいずれかである必要があり、「」は正しく表示されません。 (StandardError)
私は答えを見つけたと思います! win32/api.soが見つからないというエラーメッセージは、mkexyが無効なexyファイルを作成しているためです。行303を確認すると、フォーマットが正しくないように見えます。私はそれを次のように修正しました:
win32/api.so:
file: C:/Ruby187/lib/Ruby/gems/1.8/gems/win32-api-1.4.8-x86-mingw32/lib/win32/Ruby18/win32/api.so
type: extension-library
そして今、それは機能します。それを実行すると、「ユーザーは当惑しています」というメッセージが表示されます。これに対する解決策は、以下を追加することです。
Watir::Browser.default = "ie"
スクリプトに。次に、exerbが追加していないいくつかの不足しているライブラリがまだあります。それらを表示する方法はまだわかりませんが、exeのパスにコピーするだけで機能します。
cp -r C:/Ruby187/lib/Ruby/gems/1.8/gems/win32-api-1.4.8-x86-mingw32/lib/win32/ .
cp -r C:/Ruby187/lib/Ruby/gems/1.8/gems/watir-2.0.4/lib/watir .
問題がなくなり、スクリプトが実行されます。また、UPXを使用して梱包することもできます。
upx --best test.exe
500kbのファイルになります! UPX +この余分なものを使用すると、アプリ全体はわずか650kb程度になります。 ocraで作成できるスクリプトは1Mb未満ではありませんでした。それは本当にバグがあり、クラッシュした場合にランダムな場所に.rbファイルを残すという事実は言うまでもありません。
.exyファイルを少し調整することで、すべてのファイルを含めることができると思います。見つけたら、この質問の答えを更新します。
Ocraのドキュメントによると、Ocra
定数を確認することで、ocraのコンパイル中にアプリが実行されないようにすることができます。
require 'rubygems'
require 'watir'
if not defined?(Ocra)
browser = Watir::Browser.new
browser.goto 'http://slashdot.org'
end
おそらく、これはコンパイルを完了するのに役立ちます。
Rubyは非常に軽量なので、別のシステムにインストールしてもかまいません。すべての開発キットなどを処理することを避けたいと思うことはわかりますが、イメージを作成し、システム環境にいくつかの小さな変更を加えるだけでそれをコピーできます。
私は同じものを探していました、そして2014年8月としてこれは私が見つけることができた最高のものです:
このリンクには、実行/実行またはその他の方法で貢献した主なプロジェクトに関する素晴らしい歴史があります: https://www.Ruby-toolbox.com/categories/packaging_to_executables
私が知る限り、OCRA(Windowsでのみ動作)とReleasy(OCRAに基づいていますが、私が知る限りMacとLinuxで動作します)の2つの主要なものがあります。