Скомпилировать скрипт в Ruby - PullRequest
14 голосов
/ 03 апреля 2012

Можно ли скомпилировать скрипт ruby ​​в .exe на Windows?Я искал везде, и я попробовал следующее (Похоже, что RubyScript2EXE, Shoes и Crate все казались мертвыми или заброшенными.):

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

Я использую Ruby 1.8.7 на Windows 7 Ultimate (64-разрядная версия) из чистой системы. Я делаю это:

  1. Установите RubyInstaller 1.8.7-p358 от rubyinstaller.org
  2. gem install watir
  3. gem install 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, мне кажется, что драгоценных камней нет в пути поиска:

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?

Итак, как кто-то собирает .exe в Windows в наши дни?

Я добился некоторого прогресса в Exerb,Я обнаружил, что вы можете запустить mkexy с опцией -rrubygems, чтобы получить это. И это работает ОТЛИЧНО для большинства проектов ruby.Я попробовал это для нескольких скриптов ruby, которые используют множество различных библиотек без проблем.Например:

mkexy -rrubygems test.rb
exerb test.exy
test.exe === WORKS!

К сожалению, это не работает для Watir.Когда я запускаю .exe, созданный с помощью watir, я получаю следующее:

s4t-utils/claims.rb:24:in `user_is_bewildered': Error in the default values: :br

значение owser должно быть одним из 'safari', 'firefox' или 'ie', а '' не выглядит как rIGHT.(StandardError)

Ответы [ 5 ]

8 голосов
/ 04 апреля 2012
4 голосов
/ 04 апреля 2012

Я думаю, что нашел ответ!Сообщение об ошибке об отсутствии 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 не добавляет.Я еще не выяснил, как заставить их появиться, но вы можете просто скопировать их в путь к исполняемой программе, и это работает.

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

Это файл размером 500 КБ!С UPX + этим дополнительным материалом все приложение будет всего лишь 650 КБ или около того.Ни один скрипт, который я мог бы создать с помощью ocra, не занимал менее 1 Мб.Не говоря уже о том, что он действительно глючит и оставляет файлы .rb в случайных местах в случае сбоя.

Я думаю, что с некоторыми изменениями файла .exy я могу сделать так, чтобы он включал все файлы.Я обновлю этот вопрос ответом, если найду его.

3 голосов
/ 03 апреля 2012

Согласно документации Ocra, вы можете запретить запуск приложения во время компиляции ocra, проверив константу Ocra:

require 'rubygems'
require 'watir'

if not defined?(Ocra)
  browser = Watir::Browser.new
  browser.goto 'http://slashdot.org'
end

Возможно, это поможет пройти компиляцию.

0 голосов
/ 30 августа 2014

Я искал то же самое, и с августа 2014 года это лучшее, что я смог найти:

Эта ссылка имеет хорошую историю основных проектов, которые сделали / делают или иным образом способствовали: https://www.ruby -toolbox.com / категории / packaging_to_executables

Насколько я могу судить, есть два основных из них, OCRA (работает только на Windows) и Releasy (на основе OCRA, но, насколько я могу судить, работает на Mac и Linux)

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

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

0 голосов
/ 04 апреля 2012

Ruby настолько легок, что я никогда не возражал против его установки в другой системе.Я вижу желание избежать работы со всеми устройствами и тому подобным, но вы можете создать образ и скопировать его, сделав пару небольших изменений в системной среде.

...