[英]Compile ruby script into exe?
是否可以在Windows上將ruby腳本編譯為.exe? 我到處搜索過,我嘗試了以下內容(看起來像RubyScript2EXE,鞋子和箱子似乎都死了或被遺棄了。):
我在一個干凈的系統上使用Windows 7旗艦版(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時,看起來寶石不在搜索路徑中:
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中顯示了這些路徑,但它仍然給出了同樣的錯誤。 顯然必須有一些方法可以將rubygems路徑包含在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非常輕巧,我從不介意在另一個系統上安裝它。 我可以看到想要避免處理所有的devkits和諸如此類的東西,但你可以創建一個圖像並復制它,對系統環境進行一些小的改動。
我正在尋找同樣的事情,2014年8月這是我能找到的最好的:
這個鏈接在做/做或以其他方式貢獻的主要項目上有很好的歷史: https : //www.ruby-toolbox.com/categories/packaging_to_executables
據我所知,有兩個主要的,OCRA(僅適用於Windows)和Releasy(基於OCRA,但據我所知,可用於mac和linux)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.