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

上次簡單說明了選擇 IronRuby + Rake 來作為建置工具的原因,以及基本的安裝步驟--真的就只是基本的。要能夠用它們來進行建置 .NET 專案,還得再安裝其他套件,同時也必須學習更多 Ruby 語法。

指定相依性

無論是 NAnt、MSBuild、Makefile、還是 Rakefile,編寫 build script 時,相依關係是很基本的元素。比如說,檔案 A 相依於檔案 B,代表只要檔案 B 有修改(timestamp 有變動),就必須重新編譯檔案 A。又例如工作 A 相依於工作 B,即代表當你指定要執行工作 A 時,建置工具必定會先去執行工作 B。注意「檔案」有最近修改時間(timestamp),故可得知檔案最近是否有變動,但「工作」並沒有所謂的最近修改時間,因此工作項目之間的相依性,其實就是在指定各項工作的執行順序。

在 Rakefile 中,相依關係是由 => 符號來表示左邊的項目相依於右邊的項目,「工作」則是以關鍵字 task 來定義。Rakefile 中的「檔案」也是一種工作項目的類型,使用關鍵字 file 來定義。以下範例係取自 Rake 官網的入門教學:Introducing Rake

file 'main.o' => ["main.c", "greet.h"] do
    sh "cc -c -o main.o main.c"
end

file 'greet.o' => ['greet.c'] do
    sh "cc -c -o greet.o greet.c"
end
   
file "hello" => ["main.o", "greet.o"] do
    sh "cc -o hello main.o greet.o"
end

箭頭符號 => 其實就是 Ruby 的 hashtable 集合元素的語法。每一個 hashtable 集合元素就是一對 key 和 value,箭頭左邊的是 key,箭頭右邊則是 value。在上面的範例中,檔案 'hello' 是 key,其 value 則是一個陣列(以方括弧包住),該陣列包含兩個字串元素:"main.o" 和 "greet.o"。

語法的部分暫且說明到這裡,接著要來安裝一個好用的套件。

安裝 Albacore

上一篇文章只有介紹 IronRuby 和 Rake 的安裝步驟,但如果要建置 .NET 專案,其實還需要一個套件:Albacore。此套件提供了建置 .NET 專案的相關工作(tasks),可節省我們不少工夫。當然還有別的選擇,例如 rake-dotnet

安裝 Albacore 的方法跟 Rake 一樣,只要在命令提示字元視窗中執行下列命令:

igem install albacore

執行此安裝指令時,如果發生錯誤訊息:can't convert NilClass into String,解決方法已在第一篇提過,也就是反覆執行同樣的命令,直到成功為止。這個套件,我試了十幾次才安裝成功 >_<|||。後來在 IronRuby 網站上找到一個編號 5326 的 bug,才知道可能是因為透過網路下載套件時發生 timeout 所致。在此 bug 尚未修正之前,也就只好不斷嘗試了。

牛刀小試

一切準備就緒之後,就可以開始編寫 rakefile 來建置 .NET 專案。參考以下範例:

require 'albacore'

task :default => [:debug_build]
task :release => [:release_build]

msbuild :debug_build do |msb|
    msb.properties :configuration => :Debug
    msb.targets :Build
    msb.solution = "RakeDemo.sln"
end

msbuild :release_build do |msb|
    msb.properties :configuration => :Release
    msb.targets :Build
    msb.solution = "RakeDemo.sln"
end

此 rakefile 首先定義兩個 tasks:default 和 release,而它們又分別相依於 debug_build 和 release_build 這兩個由 Albacore 提供的 msbuild task。msbuild 的實際型別是 MSBuildTask,它會根據你提供的屬性去執行對應的 MSBuild 命令。

將以上內容存成 rakefile.rb,並將檔案放在 RakeDemo.sln 所在的目錄下,然後執行命令:

rake

其作用就等同於在 Visual Studio 中以 Debug 模式建置整個 solution。若要以 Release 模式建置專案,則是:

rake release

其執行結果看起來會像下面這張圖:


接下來要做什麼?

編寫 build script 的目的,主要是為了將整個建置過程自動化,其中除了建置專案(如本文所展示的),還可以加入單元測試、程式碼靜態分析、部署等工作。本文的範例只用到了 Albacore 提供的一個基本工作: MSBuildTask。另一個基本工作是 AssemblyInfoTask,可用來產生組件資訊,例如版本編號、版權聲明等。這部份的用法,可參考原作者 Derick Bailey 的文章:Albacore: A Suite Of Rake Build Tasks For .NET Solutions。要提醒的是,Albacore v0.2 的 AssemblyInfoTask 僅支援 C#,未來是否會支援 VB 和其他語言,目前仍不確定。

延伸閱讀

Post Comments

技術提供:Blogger.