muyu2010 发表于 2011-02-11 16:15

刚开始学习ruby,请教如何把ruby代码打包成可执行文件

刚刚开始学习ruby,请教如何把ruby代码打包成可执行文件,在任何其他机器上都可以执行。

在网上搜到的方法:
1. rubyscrip2exe
   ruby rubyscrip2exe hongbao.rb 没有反应。
2. exerb
   2.1 直接执行ruby exerb hongbao.rb 生成的exe文件不能用。错误如下:
   hongbao.rb:2:in `require': No such file to load -- watir (LoadError)
      from hongbao.rb:2

   2.2 尝试先用mkexy生成exy文件。但是我的代码是个死循环,并且是要接受命令行输入的。
   执行ruby mkexy hongbao.rb的话,一直在提示我键盘输入,和直接执行代码没什么不同了

代码如下:# coding:utf-8
require "watir"

class HongBao
       
        def initialize(filename)
                @filename = filename
                @str="看不清"
                @str2="星座运势"
        end
       
        def getHongbao
                ie=Watir::IE.new
                while true
                        IO.foreach("#{@filename}") do |line|
                                puts line
                                arr=line.split(' ')
                                name=arr
                                year=arr
                                month=arr
                                day=arr
                                ie.goto "http://hongbao.app.baidu.com/hongbao/inputname"
                                ie.text_field(:name, "name").set(name)
                                ie.select_list(:id, "select-year").select(year)
                                ie.select_list(:id, "select-month").select(month)
                                ie.select_list(:id, "select-day").select(day)
                                ie.checkbox(:id, "check-1").set
                                ie.text_field(:id, "captcha").clear
                                #puts "checkSum:"
                                #checkNum=gets
                                #ie.text_field(:id, "captcha").set(checkNum)
                                #ie.button(:id, "bn").click
                                while ie.text.encode("utf-8","gbk").include? "#{@str}"
                                        print "please input check number:"
                                        checkNum=gets
                                        ie.text_field(:name, "captcha").set(checkNum.encode("utf-8","gbk"))
                                        ie.button(:id, "bn").click
                                        sleep 1
                                end
                                sleep 1
                                if not ie.text.encode("utf-8","gbk").include? "#{@str2}"
                                        puts "got it"
                                        exit 5
                                end
                                puts "Enter to continue... ..."
                                gets
                        end
                end
        end
end

aHongBao = HongBao.new("info.txt")
aHongBao.getHongbaoinfo.txt的如下:
张三 1986 05 10
李四 1984 10 18
王五 1988 03 21
赵六 1980 11 04

2gua 发表于 2011-02-11 17:07

试试看ocra。

bugbugbug3 发表于 2011-02-12 11:12

ocra比较好用

muyu2010 发表于 2011-02-14 11:23

问题解决情况:
使用了ocra打包ruby脚本。

1、首先代码去掉了循环读取info文件的死循环(while true)# coding:utf-8
require "watir"

class HongBao
       
        def initialize(filename)
                @filename = filename
                @str="看不清"
                @str2="星座运势"
        end
       
        def getHongbao
                ie=Watir::IE.new
#                while true
                        IO.foreach("#{@filename}") do |line|
                                puts line
                                arr=line.split(' ')
                                name=arr
                                year=arr
                                month=arr
                                day=arr
                                ie.goto "http://hongbao.app.baidu.com/hongbao/inputname"
                                ie.text_field(:name, "name").set(name)
                                ie.select_list(:id, "select-year").select(year)
                                ie.select_list(:id, "select-month").select(month)
                                ie.select_list(:id, "select-day").select(day)
                                ie.checkbox(:id, "check-1").set
                                ie.text_field(:id, "captcha").clear
                                #puts "checkSum:"
                                #checkNum=gets
                                #ie.text_field(:id, "captcha").set(checkNum)
                                #ie.button(:id, "bn").click
                                while ie.text.encode("utf-8","gbk").include? "#{@str}"
                                        print "Please input check number:"
                                        checkNum=gets
                                        ie.text_field(:name, "captcha").set(checkNum.encode("utf-8","gbk"))
                                        ie.button(:id, "bn").click
                                        sleep 1
                                end
                                sleep 1
                                if not ie.text.encode("utf-8","gbk").include? "#{@str2}"
                                        puts "got it"
                                        exit 5
                                end
                                puts "Enter to continue... ..."
                                gets
                        end
#                end
        end
end

aHongBao = HongBao.new("info.txt")
aHongBao.getHongbao2、然后把info.txt内容减少到1条

1,2 两步的原因是这段代码执行的时候有个需要输入验证码的地方,如果死循环或者info.txt数据条数太多,ocra打包的时候一直在循环里,或者info数据太多花费太长时间。

3、执行cora hongbao.rb。输入一次验证码。cora打包成功,得到可执行exe文件。
4、添加更多的数据到info.txt


仍然存在的问题:如果想保留while死循环,那么该怎么打包呢?

bugbugbug3 发表于 2011-02-15 11:39

对于死循环的代码,只需判断一下Ocra即可,这样ocra就可以正常打包了。
看下面的例子:def main_loop
loop do
    puts "Hello"
    sleep 1
end
end

unless defined? Ocra   
main_loop
end
页: [1]
查看完整版本: 刚开始学习ruby,请教如何把ruby代码打包成可执行文件