2012-04-03 11 views
14

Có thể biên dịch tập lệnh ruby ​​thành một .exe trên Windows không? Tôi đã tìm kiếm khắp nơi và tôi đã thử những điều sau đây (Nó trông giống như RubyScript2EXE, Giày dép và Crate tất cả dường như đã chết hoặc bị bỏ rơi.):Biên dịch tập lệnh ruby ​​thành exe?

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

Tôi đang sử dụng của Ruby 1.8.7 trên Windows 7 Ultimate (64bit.) từ một hệ thống sạch tôi làm điều này:

  1. Install RubyInstaller 1.8.7-p358 từ 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

tôi có một kịch bản khá đơn giản mà thực hiện điều này:

require 'rubygems' 
require 'watir' 
browser = Watir::Browser.new 
browser.goto 'http://slashdot.org' 

Khi tôi chạy Ocra tôi không nhận được bất kỳ thông báo lỗi, và không có gì xảy ra:

ocra --output test.exe test.rb 
=== Loading script to check dependencies 

Exerb có vẻ như một giải pháp tốt hơn vì nó biên dịch để RBC, và nó thực sự làm điều gì đó:

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 

Vì vậy, nó không thể tìm thấy win32/api.so. Khi tôi nhìn vào C: /Ruby187/lib/ruby/site_ruby/1.8/exerb/recipe.rb nó trông giống như viên ngọc không nằm trong đường dẫn tìm kiếm:

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: . 

Vì vậy, sau khi đào bới xung quanh tôi phát hiện ra bạn có thể thêm đường dẫn tìm kiếm trong tệp exy như vậy:

path: 
    - C:/Ruby187/lib/ruby/gems/ 
    - C:/Ruby187/lib/ruby/gems/1.8 
    - C:/Ruby187/lib/ruby/gems/1.8/gems 

Sau khi nó hiển thị những đường dẫn này trong search_path, nhưng nó vẫn cho tôi lỗi tương tự. Rõ ràng phải có một số cách để có được con đường rubygems được bao gồm trong exy?

Vì vậy, làm thế nào để ai đó xây dựng một .exe trên Windows những ngày này?

Tôi đã thực hiện một số tiến bộ với Exerb, tôi phát hiện ra bạn có thể chạy mkexy với tùy chọn -rrubygems để kéo nó vào. Và điều này làm việc tuyệt vời cho hầu hết các dự án ruby. Tôi đã thử nó cho một vài kịch bản ruby ​​sử dụng một số thư viện khác nhau mà không có vấn đề gì. Ví dụ:

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

Thật không may, nó không hoạt động đối với watir. Khi tôi chạy một .exe xây dựng với watir tôi nhận được như sau: Giá trị

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

owser của phải là một trong 'săn', 'firefox', hoặc 'tức là', và '' không giống r ight .(StandardError)

+0

Có lẽ bạn có thể thử điều này: http://johnallen.us/?p=278 –

+0

Bạn có thấy một giao diện điều khiển sinh ra bởi Ocra? Nếu bạn biên soạn một .rb thay vì một .rbw bạn nên đã nhìn thấy một. –

+0

Tôi thực sự không nhìn thấy bất cứ điều gì, không có cửa sổ, không có gì. Có lẽ nó xuất hiện thông báo lỗi được đề cập trong liên kết johnallen.us và sau đó chết? Tôi sẽ thử nghiệm nhiều hơn với ocra vào ngày mai và cập nhật câu hỏi này. –

Trả lời

3

Theo tài liệu Ocra, bạn có thể ngăn chặn ứng dụng của bạn chạy trong ocra biên soạn bằng cách kiểm tra Ocra liên tục:

require 'rubygems' 
require 'watir' 

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

lẽ điều này sẽ giúp vượt qua những biên dịch.

0

Ruby có trọng lượng nhẹ đến mức tôi chưa bao giờ nghĩ đến việc cài đặt nó trên một hệ thống khác. Tôi có thể thấy muốn tránh đối phó với tất cả các devkits và whatnot, nhưng bạn có thể tạo ra một hình ảnh và sao chép xung quanh với một vài thay đổi nhỏ cho môi trường hệ thống.

4

Tôi nghĩ rằng tôi đã tìm thấy câu trả lời! Thông báo lỗi về việc thiếu win32/api.so là vì mkexy đang tạo một tệp exy không hợp lệ. Kiểm tra dòng 303 có vẻ như nó định dạng không chính xác. Tôi đã sửa nó thành:

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 

Và bây giờ nó hoạt động. Khi tôi chạy nó, tôi vẫn nhận được thông báo về "người dùng bị hoang mang". Giải pháp cho điều này là để thêm:

Watir::Browser.default = "ie" 

vào tập lệnh. Tiếp theo vẫn còn một vài thư viện bị thiếu mà exerb không thêm vào. Tôi đã không tìm ra cách để làm cho chúng xuất hiện nhưng bạn chỉ có thể sao chép chúng vào đường dẫn của exe và nó hoạt động.

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 . 

Sự cố sẽ biến mất và tập lệnh thực thi! Ngoài ra, bạn có thể sử dụng UPX để gói nó.

upx --best test.exe

Nó trở thành tệp 500kb! Với UPX + công cụ bổ sung này, toàn bộ ứng dụng sẽ chỉ là 650kb hoặc hơn. Không có kịch bản tôi có thể làm với ocra nhỏ hơn 1Mb. Không phải đề cập đến thực tế rằng nó thực sự lỗi và lá các tập tin .rb ở vị trí ngẫu nhiên nếu nó bị treo.

Tôi nghĩ rằng với một số chỉnh sửa của tập tin .exy tôi có thể làm cho nó bao gồm tất cả các tập tin. Tôi sẽ cập nhật câu hỏi này với câu trả lời nếu tôi tìm thấy nó.

0

tôi đang tìm kiếm điều tương tự và như tháng 8 năm 2014 này là tốt nhất tôi có thể tìm thấy:

Liên kết này có một lịch sử tốt đẹp trên các dự án chính mà đã làm/làm hoặc đóng góp: https://www.ruby-toolbox.com/categories/packaging_to_executables

theo như tôi có thể nói có hai cái chính, OCRA (chỉ hoạt động chỉ trên cửa sổ) và Releasy (dựa trên OCRA nhưng hoạt động trên Mac và linux như xa như tôi có thể nói)

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

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