NAnt (2)

看完上一篇,你大概會想,要寫的 task 是如此之少,這真是太完美了。
但是對於笨Q來說,不幸的事情發生了…
笨Q 聽說 .Net 也移植到 Linux 上了,所以他想試試看把上篇的程式拿到 Linux 下編譯,於是笨 Q 安裝了 Mono。接著安裝 NAnt。
同樣他下載了 NAnt, 並且解開,放到 /opt/nant 下。
再把整個專案複製到 Linux 下,並且修改了一下 build 檔的內容,由

<property name=”nant.settings.currentframework” value=”net-1.1″/>

改為

<property name=”nant.settings.currentframework” value=”mono-1.0″/>

讓 NAnt 在建立專案前自動把編譯環境切換為 mono。
接著輸入
$mono /opt/nant/bin/NAnt.exe
這時只見 NAnt 很不爭氣的吐了一句:

Invalid element <solution>. Unknown task or datatype

笨Q 只能流淚默默接受這個事實,他知道必須自己學著寫 target。


一個 NAnt 的 build 檔案其實是一個 XML 檔案,最基本的元素是 project,project 則是由 target 與 property 組成的,而 target 則是由許多的 task 組成的。
所以一個空的 build 檔案是長這個樣子:
<?xml version="1.0"?>
<project name="dnsedu" default=“build”>
  <property name=“nant.settings.currentframework” value=“net-1.1″/>
  <target name=“build” description="Default build target" depends="dnsedu">
  </target>
</project>
那麼 target 裡面有哪些 task 可以用呢?你可以參考官方網站的這裡
裡面真的很多 task,除了基本編譯(csc, vbc, cl, al, ilasm, resgen)之外,他還有 copy, cvs, mail, nunit …等等的 task,絕對可以讓你組合出你想要的東西。
要改寫上篇的 build(我假設你用 c#),我們會用到 csc、mkdir 這兩個主要的 task。
以下是改寫好的 build 檔案
<project name="your_project" default="build">
  <property name="nant.settings.currentframework" value="mono-1.0"/>
  <property name="debug" value="false"/>
  <target name="build">
    <mkdir dir="bin" unless="${directory::exists(‘bin’)}" />
    <csc target="winexe" output="bin/your_project.exe" debug="${debug}">
      <sources>
        <include name="*.cs"/>
      </sources>
      <references>
        <include name="System.Drawing.dll" />
        <include name="System.Data.dll" />
        <include name="System.Windows.Forms.dll"/>
      </references>
      <resources>
        <include name="*.resx"/>
      </resources>
    </csc>
  </target>
</project>
mkdir task 這邊我使用了 unless,意思是 if not,所以意思就是當目錄不存在的時候,就建立一個。這裡判斷目錄是否存在的函數是 NAnt 內建的,想知道有哪些函數可用,可以參考NAnt官方網站的這邊
csc task 裡面,則需要指定輸出類型(target),輸出檔名(output)以及要不要包含除錯資訊(debug)。
夾在 <csc></csc> 裡面的,就是指定你 c# 程式,所引用(或參考)到的組件以及所使用的資源檔。
很簡單,對吧~
這就是最基本的囉,下次我們來談談 web 應用程式的部份。