将ruby脚本编译成exe?

可以在Windows上将ruby脚本编译成.exe吗? 我到处搜索过,我尝试了以下内容(看起来像RubyScript2EXE,鞋子和箱子似乎都死了或被遗弃了。):

  1. http://ocra.rubyforge.org/
  2. http://exerb.sourceforge.jp/index.en.html

我在一个干净的系统上使用Windows 7旗舰版(64位)上的Ruby 1.8.7我这样做:

  1. 从rubyinstaller.org安装RubyInstaller 1.8.7-p358
  2. gem安装watir
  3. gem安装ocra
  4. git clone git://github.com/snaury/exerb-mingw.git
  5. cd exerb-mingw
  6. ruby setup.rb

我有一个相当简单的脚本来执行此操作:

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中显示了这些路径,但它仍然给我相同的错误。 显然必须有一些方法让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)

https://github.com/larsch/ocra/

https://github.com/Spooner/releasy/

Interesting Posts