在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的研究,等以後有了結果再貼出來