是否可以在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'中的一个,并且''看起来不是r 飞行。 (StandardError的)
答案 0 :(得分:8)
答案 1 :(得分:4)
我想我找到了答案!关于缺少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文件可以使其包含所有文件。如果我找到答案,我会用答案更新这个问题。
答案 2 :(得分:3)
根据Ocra文档,您可以通过检查Ocra
常量来阻止您的应用在ocra编译期间运行:
require 'rubygems'
require 'watir'
if not defined?(Ocra)
browser = Watir::Browser.new
browser.goto 'http://slashdot.org'
end
也许这有助于完成编译。
答案 3 :(得分:0)
Ruby非常轻巧,我从不介意在另一个系统上安装它。我可以看到想要避免处理所有的devkits和诸如此类的东西,但你可以创建一个图像并复制它,只需对系统环境进行一些小的改动。
答案 4 :(得分:0)
我一直在寻找同样的东西,而2014年8月这是我能找到的最好的东西:
此链接在执行/执行或以其他方式贡献的主要项目上有很好的历史记录: https://www.ruby-toolbox.com/categories/packaging_to_executables
据我所知,有两个主要的,OCRA(仅适用于Windows)和Releasy(基于OCRA,但据我所知,可用于mac和linux)