使用 IronRuby 和 Rake 來自動建置 .NET 專案 Part 1

一直都覺得應該用 NAnt 或 MSBuild 來自動化建置自己的 .NET 專案,可是那些 XML 格式的設定檔實在不是我的菜。就好像一直說服自己應該多熟悉 JavaScript,但心理上依然抗拒,直到碰到 jQuery(可見我有多懶)。對於自動化建置,則是看到 Rake 才眼睛為之一亮:這才是我想要的 build script 編寫方式啊!

畢竟,程式設計師最擅長的是什麼呢?難道是確保 XML 元素有起始標籤和結束標籤嗎?是以肉眼解讀那些標籤內含的元素和屬性值嗎?程式設計師最擅長的,自然是寫 code、讀 code 了。儘管 XML + code 的開發方式有一些好處(例如減少重新編譯的機會),對我來說,那層心理的抗拒還是不易消除。我還是比較喜歡易讀、易理解的語法。因此,我花了點時間去找這類以程式語言來撰寫 build script 的解決方案(以 .NET 平台為主)。包括:
Shake 的名稱大概是結合 C# Make 或 Sharp Make 而來,它可以讓你用 C# 語法來撰寫 build script。我一開始對它很感興趣,畢竟,不用再學另一套程式語言還是很有吸引力。只是,此開放源碼專案似乎不是太活躍,說明文件不夠詳細,功能也還很陽春。

另一個工具是 Phantom,它是以 C# 和 Boo 兩種程式語言所開發而成。稍微看了一下文件,其 build script 的語法似乎就是採用 Boo 的語法,而 Boo 的語法主要是參考 Python 和 C# 來設計,學習門檻應該不會太高。若非得學一套新語言,在 Boo 與 Ruby 之間,我應該會先選擇 Boo。然而無論知名度還是普及率,Ruby 怎麼看都比 Boo 更有競爭力,學習資源也更多。因此,還是決定先試試看 IronRuby + Rake。Rake 就是 Ruby 版本的 MAKE。

安裝 IronRuby 與 Rake

首先,到 http://ironruby.codeplex.com/ 下載 IronRuby 安裝程式或 zip 檔。我下載的是 IronRuby 1.1.1 Installer for .NET 4.0 與 Visual Studio 2010。安裝程式會將 Ruby 的執行檔所在路徑加入系統環境變數 PATH,讓你在任何資料夾都可以執行 Ruby。如果你下載的是 zip 檔,記得要手動加入 PATH。

接著要安裝 Rake,方法很簡單,開啟「命令提示字元」,輸入以下命令:

igem install rake

若安裝成功,IronRuby 應用程式的 bin 目錄底下會多出兩個檔案:rake 和 rake.bat。我第一次執行此命令時,出現下列錯誤:

ERROR:  While executing gem ... (TypeError)
    can't convert NilClass into String

但執行第二次就成功了,猜想多半是還有一點 bug。如果你在安裝時碰到這個錯誤,可以多嘗試幾次。我曾在安裝某個 gem(Ruby 的函式庫)時,至少執行了十幾次的安裝命令才成功。

安裝好 IronRuby 1.1.1 之後, Visual Studio 2010 會有新的 IronRuby 專案範本,如下圖:
在開發 Ruby 專案時,Add New Item 對話窗就會有 Ruby 檔案類型可供挑選:


編寫第一個 Rakefile

Rakefile 指的是 Rake 的 makefile,副檔名與 Ruby 的程式檔案一樣是 .rb。任何純文字編輯器都可以編寫 Ruby 程式碼,但使用 Visual Studio 來撰寫 Ruby 程式有個好處:提供語法高亮度顯示。在 C# 或 VB 專案中,Add New Item 對話窗並沒有 Ruby File 範本可供挑選。不過沒關係,我們可以在專案中加入一般的程式檔案(Code File),只要把副檔名改為 .rb,就一樣有 Ruby 語法高亮度顯示的編輯環境。

首先,建立一個新的程式檔案˙,命名為 rakefile.rb,並輸入以下內容:

# Rakefile.rb - 我的第一個 rakefile。
task :default => [:HelloRake]
 
desc "Hello Rake!"
task :HelloRake do 
    puts "Hello, This is my first rakefile."
end

存檔之後,開啟命令提示字元,在此檔案所在的目錄下輸入指令:rake,它就會去執行我們的 rakefile.rb。由於沒有在命令列參數指定要執行什麼工作,因此預設會執行名為 default 的工作。你可以看到,關鍵字 task 就是用來定義工作,而 default 代表預設工作項目,箭頭 => 則是用來指定其相依的工作。因此,這裡的指令在告訴 Rake:執行預設工作時,請先去執行 HelloRake。 HelloRake 也是一項工作,其任務很簡單,只是在螢幕上輸出一段訊息而已。

一個 rakefile 裡面可包含多項工作,你可以在命令提示字元視窗輸入 rake --tasks 來顯示 rakefile 中的所有工作。如果要指定執行特定工作,可在 rake 命令之後加上工作項目的名稱,例如:rake HelloRake

值得一提的是,當我在 rakefile 裡面使用 puts 來顯示中文訊息的時候,執行時會出現 unable to translate unicode character 的錯誤。這個問題,我還不確定是 IronRuby 的限制,還是有字元編碼的相關設定。註解是可以輸入中文的。

小結

這篇 Rake 101 從除夕夜寫到大年初一清晨,我看就先寫到這裡吧。真的該出去走走了...Orz

延伸閱讀

2 則留言:

  1. 看了你的文章後,我也想來玩玩,改用rake取代原本的nant,建議你可以試著改用IronRuby 1.0的版本,因為IronRuby 1.1之後都是採用ruby 1.9,與1.8不太相容,所以可能會造成有些gem無法相容吧!另外,中文的亂碼問題會不會是因為cmd.exe的codepage問題呢?如果你的作業系統環境是正體中文的windows,那麼cmd的codepage應該是950,你可以用chcp 65001轉成UTF-8來試試!

    回覆刪除
  2. 原來如此,多謝提點 ^_^

    回覆刪除

技術提供:Blogger.
回頂端⬆️