หน้าเว็บ

วันอังคารที่ 2 กุมภาพันธ์ พ.ศ. 2553

แปลงซอร์ซไฟล์ Ruby ให้เป็น .exe

ริงอยู่ที่เราสามารถรันซอร์ซไฟล์ .rb เพื่อเรียกโปรแกรมที่เขียนขึ้นมาใช้ได้เลย แต่มันมีเงือนไขอยู่ที่ว่าเครื่องของเราต้องมี Ruby intepreter และมันต้องรู้จักไฟล์ .rb ด้วยนะ อันนี้ถ้าเราลง Ruby installer หรือ Ruby package ไปแล้วก็ไม่มีปัญหา แต่ถ้าสมมติว่าจะเอาโปรแกรมที่เขียนด้วย Ruby ไปรันที่เครื่องอื่น(สมมติว่าจะรันบน Windows นะ)ที่ไม่มี Ruby ล่ะจะทำยังไง ...ทางเลือกหนึ่งก็คือแปลงซอร์ซไฟล์ .rb ให้เป็น .exe ครับ ซึ่งวันนี้เราจะมาดูกันว่ามันมีวิธีการทำอย่างไร

เครื่องมือ?
ณ ตอนนี้มี gems อยู่ 2 ตัวที่ผมรู้จักที่สามารถใช้ในการแปลงไฟล์เป็น .exe ซึ่งได้แก่ rubyscript2exe และ ocra
ทั้ง 2 ตัวนี้ผมเคยใช้มาแล้วครับ ขอเล่าประสบการณ์ให้ฟังหน่อยแล้วกัน

Rubyscript2exe

rubyscript2exe เป็น gems ตัวแรกที่ผมได้มีโอกาสทดลองใช้การแปลงไฟล์ครับ แล้วก็เคยประสบความสำเร็จในการใช้มันเมื่อนานมาแล้วด้วย(เย้) แต่มีอยู่วันหนึ่งมีเหตุให้ผมต้องลง Ruby และ RubyGem บนเครื่องใหม่ ปรากฏว่าหลังจากวันนั้นผมก็ไม่สามารถใช้เจ้า rubyscript2exe เพื่อแปลงไฟล์ให้ผมได้อีกเลย มันพ่น error message ตลอดเวลาที่ผมพยายามจะ complie มัน เคยพยายามหา solution จาก webboard ต่างๆก็แล้วแต่ก็ไม่ได้ช่วยแก้ปัญหาเลยครับ ทำเอาผมปวดหัวอยู่หลายวัน

ผมเข้าใจว่า rubyscript2exe น่าจะมีปัญหากับ version ของ RubyGems นั่นคือมันไม่สามารถใช้กับ RubyGems version > 1.2.0 (ขณะนี้ version ล่าสุดของ RubyGems คือ 1.3.5) แต่จะให้ผมลง Ruby กับ RubyGems ใหม่เพื่อทดสอบนั้นคงไม่ดีกว่าครับ กลัว gems ตัวอื่นๆของผมจะเดี้ยงไปด้วย ฮา
หากมีท่านใดอาสาช่วยผมทดลองก็จะขอบคุณมากๆเลยครับ ถ้าใช้งานได้ล่ะก็อย่าลืมเอาผลมาบอกกันบ้างนะครับ
ใครอยากลอง rubyscript2exe ก็สามารถ install ผ่าน gems ได้เลยด้วยคำสั่ง

C:\gem install rubyscript2exe


ส่วนการใช้งานเมื่อค้องการแปลงไฟล์เป็น .exe ก็ใช้ดังนั้นครับ(สำหรับท่านที่ install ด้วย RubyGem เท่านั้นนะครับ)

C:\>rubyscript2exe your_code.rb


สำหรับรายละเอียดของการใช้งานรวมถึง option ต่างๆของ rubyscript2exe นั้นสามารุเข้าไปดูได้ที่ official website ของ rubyscript2exe ครับ

Ocra

เมื่อผิดหวังจาก rubyscript2exe แล้วผมก็เริ่มค้นหาครับว่ามีตัวช่วยอื่รหรือไม่ แล้วในที่สุดผมก็เจอครับ ซึ่งก็คือ gem ที่ชื่อ Ocra นั่นเอง
เท่าที่ผมใช้งานมานั้นยังไม่เจอปัญหาหรือ error ใดๆกับเจ้า Ocra เลยครับ ผมจึงขอแนะนำท่านที่ต้องการแปลงไฟล์เป็น .exe ลองใช้ดูนะครับ ของเขาดีจริงๆ
Ocra นั้นมาเป็น RubyGem แพกเกจครับดังนั้นเราสามารถติดตั้งได้โดยใช้คำสั่ง

C:\gem install ocra

ส่วนวิธีการใช้งานนั้นก็ไม่ยาก พิมพ์คำสั่ง ocra แล้วตามด้วยชื่อไฟล์ .rb ที่เราต้องการแปลง
ผมขอแสดงตัวอย่างของการแปลงซอร์ซไฟล์ .rb ไปเป็น .exe โดยใช้ ocra สักตัวอย่างนะครับ โดยผมสมมติว่าซอร์ซไฟล์ของผมชื่อ test_ocra.rb ซึ่งมีหน้าตาดังนี้นะครับ

puts "Hello Ocra"
STDIN.getc

ดังนั้นผมสามารถแปลงไฟล์ซอร์ซโค้ดดังกล่าวให้เป็นไฟล์ .exe ได้ด้วยคำสั่งต่อไปนี้

C:\ocra test_ocra.rb

จากนั้น ocra จะทำการ complie ซอร์ซไฟล์ของเราและตรวจสอบ include ไฟล์ต่างๆ(ถ้ามี)
ซึ่งตรงนี้เราจะเห็นโปรแกรมของเรารันขึ้นมาก็ไม่ต้องตกใจให้ปิดมันลงไปซะ เพื่อให้ ocra ทำการ Build ไฟล์ของเราต่อไป
ซึ่งจะได้ผมลัพธ์ดังนี้

=== Loading script to check dependencies
Hello Ocra
a
=== Building test_ocra.exe
m src
a src\test_ocra.rb
m bin
a bin\ruby.exe
a bin\msvcrt-ruby18.dll
a bin\zlib1.dll
m lib
m lib\ruby
m lib\ruby\gems
m lib\ruby\gems\1.8
m lib\ruby\gems\1.8\specifications
a lib\ruby\gems\1.8\specifications\ocra-1.1.3.gemspec
m lib\ruby\site_ruby
m lib\ruby\site_ruby\1.8
m lib\ruby\site_ruby\1.8\rubygems
a lib\ruby\site_ruby\1.8\rubygems\defaults.rb
m lib\ruby\1.8
m lib\ruby\1.8\i386-mswin32
a lib\ruby\1.8\i386-mswin32\thread.so
a lib\ruby\1.8\thread.rb
a lib\ruby\1.8\i386-mswin32\etc.so
a lib\ruby\1.8\i386-mswin32\rbconfig.rb
a lib\ruby\site_ruby\1.8\rubygems\exceptions.rb
a lib\ruby\site_ruby\1.8\rubygems\requirement.rb
a lib\ruby\site_ruby\1.8\rubygems\version.rb
a lib\ruby\site_ruby\1.8\rubygems\dependency.rb
a lib\ruby\site_ruby\1.8\rubygems\gem_path_searcher.rb
a lib\ruby\site_ruby\1.8\rubygems\user_interaction.rb
a lib\ruby\site_ruby\1.8\rubygems\platform.rb
a lib\ruby\site_ruby\1.8\rubygems\specification.rb
a lib\ruby\site_ruby\1.8\rubygems\source_index.rb
a lib\ruby\site_ruby\1.8\rubygems\builder.rb
a lib\ruby\1.8\i386-mswin32\stringio.so
m lib\ruby\1.8\yaml
a lib\ruby\1.8\yaml\error.rb
a lib\ruby\1.8\i386-mswin32\syck.so
a lib\ruby\1.8\yaml\ypath.rb
a lib\ruby\1.8\yaml\basenode.rb
a lib\ruby\1.8\yaml\syck.rb
a lib\ruby\1.8\yaml\tag.rb
a lib\ruby\1.8\yaml\stream.rb
a lib\ruby\1.8\yaml\constants.rb
a lib\ruby\1.8\rational.rb
m lib\ruby\1.8\date
a lib\ruby\1.8\date\format.rb
a lib\ruby\1.8\date.rb
a lib\ruby\1.8\yaml\rubytypes.rb
a lib\ruby\1.8\yaml\types.rb
a lib\ruby\1.8\yaml.rb
a lib\ruby\1.8\i386-mswin32\Win32API.so
a lib\ruby\site_ruby\1.8\rubygems\config_file.rb
a lib\ruby\site_ruby\1.8\rubygems\custom_require.rb
a lib\ruby\1.8\fileutils.rb
a lib\ruby\site_ruby\1.8\rubygems.rb
a lib\ruby\site_ruby\1.8\ubygems.rb
m lib\ruby\site_ruby\1.8\i386-msvcrt
a lib\ruby\site_ruby\1.8\i386-msvcrt\zlib.so
a lib\ruby\1.8\i386-mswin32\socket.so
a lib\ruby\1.8\timeout.rb
m lib\ruby\1.8\net
a lib\ruby\1.8\net\protocol.rb
m lib\ruby\1.8\uri
a lib\ruby\1.8\uri\common.rb
a lib\ruby\1.8\uri\generic.rb
a lib\ruby\1.8\uri\ftp.rb
a lib\ruby\1.8\uri\http.rb
a lib\ruby\1.8\uri\https.rb
a lib\ruby\1.8\uri\ldap.rb
a lib\ruby\1.8\uri\mailto.rb
a lib\ruby\1.8\uri.rb
a lib\ruby\1.8\net\http.rb
a lib\ruby\1.8\parsedate.rb
a lib\ruby\1.8\time.rb
a lib\ruby\site_ruby\1.8\rubygems\remote_fetcher.rb
a lib\ruby\site_ruby\1.8\rubygems\spec_fetcher.rb
e RUBYOPT -rubygems
e RUBYLIB
e GEM_PATH  \gemhome
l bin\ruby.exe ruby.exe " \src\test_ocra.rb"
=== Compressing
=== Finished (Final size was 505569)


เท่านี้ก็เป็นอันเสร็จสิ้น เราจะได้ไฟล์ test_ocra.exe ที่ต้องการออกมา
เมื่อลองรันไฟล์ .exe ดูก็จะได้ผลลัพธ์ดังนี้


ไม่ยากเลยใช้ไหมครับ
คุณสามารถเข้าไปดูรายละเอียดของการใช้งาน ocra นอกเหนือจากที่ผมได้นำเสนอไว้ในวันนี้ได้ที่ Official website ของ Ocra นะครับ

อย่างไรก็ตาม การทำซอร์ซไฟล์ .rb ให้เป็น .exe ด้วย Ocra หรือ Rubyscript2exe อาจไม่ใช้ทางเลือกที่ดีที่สุด เพราะข้อเสียที่เห็นได้ชัดเจนคือขนาดของไฟล์ exe หลังจากที่แปลงไฟล์แล้วนั้นมีขนาดใหญ่โตจริงๆครับ ไฟล์ test_ocra.exe จากตัวอย่างข้างต้นที่เป็นแค่โปรแกรม hello ธรรมดาๆยังปาเข้าไปกว่า 500K แล้วครับ แต่ถ้าเป็นโปรแกรม hello เหมือนกันแต่เป็น GUI โดยเขียนภายใต้ไลบรารี WxRuby นั้นหลังจากแปลงไฟล์เป็น .exe แล้วขนาดของไฟล์จะใหญ่ถึง 2.6M เลยทีเดียว

อันนี้ถือว่าเป็นโจทย์ข้อสำคัญของภาษา Ruby เหมือนกันครับ หากต้องการใช้ application ที่พัฒนาด้วยภาษา Ruby ถูกนำไปใช้อย่างจริงจังในตลาด

แล้วมีทางเลือกอื่นไหม ถ้ายังอยากนำ app ที่เขียนด้วย Ruby ไปใช้?
ถามผมตอนนี้คงตอบว่า ให้ไปลอง JRuby ดูครับ เพราะมันรันบน JVM มันควรจะมีวิธีการที่สามารถนำไปใช้ได้กว้างกว่ารึเปล่า
ยังไม่เคยศึกษาอย่างจริงจังเหมือนกัน
ท่านใดรู้กรุณาบอกเป็นวิทยาทานทีนะคร้าบ(ซะงั้น - -'')