Подтвердить что ты не робот

Скомпилировать ruby ​​script в exe?

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

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

  • Установите RubyInstaller 1.8.7-p358 с rubyinstaller.org
  • gem install watir
  • gem install ocra
  • git clone git://github.com/snaury/exerb-mingw.git
  • cd exerb-mingw
  • ruby ​​setup.rb

У меня довольно простой script, который делает это:

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, я узнал, что вы можете запустить mkexy с параметром -rrubygems, чтобы вытащить это. И это работает GREAT для большинства рубиновых проектов. Я попробовал это для нескольких рубиновых скриптов, которые без проблем используют несколько разных библиотек. Например:

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 должно быть одним из "сафари", "firefox" или "ie", а "не выглядит r IGHT. (StandardError)

4b9b3361

Ответ 2

Думаю, я нашел ответ! Сообщение об ошибке 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"

в script. Затем есть еще несколько отсутствующих библиотек, которые 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 .

Проблема исчезает, и выполняется script! Кроме того, вы можете использовать UPX для его упаковки.

upx --best test.exe

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

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

Ответ 3

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

require 'rubygems'
require 'watir'

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

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

Ответ 4

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

Ответ 5

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

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

Насколько я могу судить, есть два основных: OCRA (работает только на окнах) и Releaseasy (на основе OCRA, но, насколько я могу судить, работает с маками и linux)

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

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