现在的位置: 首页 > 综合 > 正文

更新ruby1.9.1中的rubyscript2exe.rb脚本程序

2013年09月16日 ⁄ 综合 ⁄ 共 1488字 ⁄ 字号 评论关闭

   在ruby1.9中,如果用rubyscript2exe.rb 程序来运行,会报错。 $0不可以被replace的,因为它是被frozen的。

   同时也因为在ruby1.9中,require 的时候,是直接将被包含的文件名转化成 绝对路径加载的,也避免用户多次加载相对路径不一样,但实际上绝对路径是一样的文件。

 

   这些修改,从程序的可靠性和效率是有好处的。

 

   如果我们想使用打包的时候,一般都有两个选择,一个是rubyscript2exe.rb,一个是exerb。

 

   在ruby 1.8.7 中,发现都可以使用,并且一般来说exerb感觉还要快一点。

 

   但到了ruby1.9.1的时候,发现这两个工具都不能使用了。必须要做相应的修改。

 

     exerb也是有上面的问题的,如果你探究了这两者实现,感觉他们都是差不多方式。exerb装起来还要更麻烦的,而rubyscript2exe就要简单一些。

 

     从实现的方式来说,速度应该也差不多,都是把文件从exe的资源section里面提取出来,然后在临时目录上执行。 exerb是把如何加入到资源section的这一段都放到了源码中,而rubyscript2exe 只是提供了exe文件来实现这个功能。这个东西,其实了解了PE的文件格式头,应该都没什么难度的。   

    

     我一开始是从rubyscript2exe.rb开始,看看能否改动一下,可以使用到ruby1.9.1中,发现不行。并且它只是一个文件,还不知道是怎么回事来加载的。于是,有空的时候,下载exerb来研究,它的代码多,它目前的1.4.8版本只有ruby1.9的,并且还不能用,郁闷。
     没办法,因为之前自己用mingw/msys来编译ruby1.9.1的代码,所以只好用mingw来编译这一块,而不能用它提供的VC的模块。

       然后试着编译1.9.1的模块,通过配置mak文件,可以编译通过。但将它用到exerb上会出现问题,说最后一个section不是.rsrc的。于是只好查找ld的选项,加上了 -Wl,--gc-sections,--strip-all 就ok了。然后可以产生exe文件,但运行报非法的win32程序,用PEEditor修复一下,可以运行了。

      有个问题,如果使用了#encoding :gbk的magic comment,会报找不到gbk.so,我看过了生成的exe中的资源段,已经包含了它。 但就是不对,看来还得仔细研究exerb的代码了。

      由于时间紧,只好把这个任务暂时放一下。 于是,我又回到rubyscript2exe上来,通过仔细看它的代码,已经在调试exerb中积累的经验,很快就找到它里面的窍门了。

      通过它的选项,将它自身的打包的tar文件解压,然后就可以看到它里面的所有的代码了。一下子就来精神了,因为知道也可以想研究exerb一样来研究了。 并且它里面的代码更少, 于是现在它的包里面,手工运行ruby init.rb test.rb,慢慢的修改了几个参数,就可以顺利打包成exe了。

     剩下的事情就很简单的了,将修改只好的包文件,用逆过程放到rubyscript2exe中,基本上可以使用了。 呵呵

     这也就是这篇blog的目的的。    

      修改之后的rubyscript2exe.rb 见这个链接: http://download.csdn.net/source/1199453         

 

     PS: 对于exerb的研究,等以后有了结果再贴出来     

抱歉!评论已关闭.