免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5049 | 回复: 4
打印 上一主题 下一主题

刚开始学习ruby,请教如何把ruby代码打包成可执行文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-11 16:15 |只看该作者 |倒序浏览
刚刚开始学习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的话,一直在提示我键盘输入,和直接执行代码没什么不同了

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

  3. class HongBao
  4.        
  5.         def initialize(filename)
  6.                 @filename = filename
  7.                 @str="看不清"
  8.                 @str2="星座运势"
  9.         end
  10.        
  11.         def getHongbao
  12.                 ie=Watir::IE.new
  13.                 while true
  14.                         IO.foreach("#{@filename}") do |line|
  15.                                 puts line
  16.                                 arr=line.split(' ')
  17.                                 name=arr[0]
  18.                                 year=arr[1]
  19.                                 month=arr[2]
  20.                                 day=arr[3]
  21.                                 ie.goto "http://hongbao.app.baidu.com/hongbao/inputname"
  22.                                 ie.text_field(:name, "name").set(name)
  23.                                 ie.select_list(:id, "select-year").select(year)
  24.                                 ie.select_list(:id, "select-month").select(month)
  25.                                 ie.select_list(:id, "select-day").select(day)
  26.                                 ie.checkbox(:id, "check-1").set
  27.                                 ie.text_field(:id, "captcha").clear
  28.                                 #puts "checkSum:"
  29.                                 #checkNum=gets
  30.                                 #ie.text_field(:id, "captcha").set(checkNum)
  31.                                 #ie.button(:id, "bn").click
  32.                                 while ie.text.encode("utf-8","gbk").include? "#{@str}"
  33.                                         print "please input check number:"
  34.                                         checkNum=gets
  35.                                         ie.text_field(:name, "captcha").set(checkNum.encode("utf-8","gbk"))
  36.                                         ie.button(:id, "bn").click
  37.                                         sleep 1
  38.                                 end
  39.                                 sleep 1
  40.                                 if not ie.text.encode("utf-8","gbk").include? "#{@str2}"
  41.                                         puts "got it"
  42.                                         exit 5
  43.                                 end
  44.                                 puts "Enter to continue... ..."
  45.                                 gets
  46.                         end
  47.                 end
  48.         end
  49. end

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

论坛徽章:
0
2 [报告]
发表于 2011-02-11 17:07 |只看该作者
试试看ocra。

论坛徽章:
0
3 [报告]
发表于 2011-02-12 11:12 |只看该作者
ocra比较好用

论坛徽章:
0
4 [报告]
发表于 2011-02-14 11:23 |只看该作者
问题解决情况:
使用了ocra打包ruby脚本。

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

  3. class HongBao
  4.        
  5.         def initialize(filename)
  6.                 @filename = filename
  7.                 @str="看不清"
  8.                 @str2="星座运势"
  9.         end
  10.        
  11.         def getHongbao
  12.                 ie=Watir::IE.new
  13. #                while true
  14.                         IO.foreach("#{@filename}") do |line|
  15.                                 puts line
  16.                                 arr=line.split(' ')
  17.                                 name=arr[0]
  18.                                 year=arr[1]
  19.                                 month=arr[2]
  20.                                 day=arr[3]
  21.                                 ie.goto "http://hongbao.app.baidu.com/hongbao/inputname"
  22.                                 ie.text_field(:name, "name").set(name)
  23.                                 ie.select_list(:id, "select-year").select(year)
  24.                                 ie.select_list(:id, "select-month").select(month)
  25.                                 ie.select_list(:id, "select-day").select(day)
  26.                                 ie.checkbox(:id, "check-1").set
  27.                                 ie.text_field(:id, "captcha").clear
  28.                                 #puts "checkSum:"
  29.                                 #checkNum=gets
  30.                                 #ie.text_field(:id, "captcha").set(checkNum)
  31.                                 #ie.button(:id, "bn").click
  32.                                 while ie.text.encode("utf-8","gbk").include? "#{@str}"
  33.                                         print "Please input check number:"
  34.                                         checkNum=gets
  35.                                         ie.text_field(:name, "captcha").set(checkNum.encode("utf-8","gbk"))
  36.                                         ie.button(:id, "bn").click
  37.                                         sleep 1
  38.                                 end
  39.                                 sleep 1
  40.                                 if not ie.text.encode("utf-8","gbk").include? "#{@str2}"
  41.                                         puts "got it"
  42.                                         exit 5
  43.                                 end
  44.                                 puts "Enter to continue... ..."
  45.                                 gets
  46.                         end
  47. #                end
  48.         end
  49. end

  50. aHongBao = HongBao.new("info.txt")
  51. aHongBao.getHongbao
复制代码
2、然后把info.txt内容减少到1条

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

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


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

论坛徽章:
0
5 [报告]
发表于 2011-02-15 11:39 |只看该作者
对于死循环的代码,只需判断一下Ocra即可,这样ocra就可以正常打包了。
看下面的例子:
  1. def main_loop
  2.   loop do
  3.     puts "Hello"
  4.     sleep 1
  5.   end
  6. end

  7. unless defined? Ocra   
  8.   main_loop
  9. end
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP