因為學習C#各種特性和使用方法的需要,常常會編寫和收集一些例子程式碼。一段時間之後,這種程式碼的數量就增加到無法通過簡單粗暴的方式進行管理了。採用NAnt進行管理是一個不錯的選擇,雖然部分特性只有MSBuild才支援,基於偏好選擇NAnt。
首先是一個頂層目錄下的配置檔案。
<?xml version="1.0"?> <project name="hycs project" default="build"> <target name="*"> <nant target="${target::get-current-target()}"> <buildfiles> <include name="**/*.build" /> <!-- avoid recursive execution of current build file --> <exclude name="${project::get-buildfile-path()}" /> </buildfiles> </nant> </target> </project>
這個檔案的功能就是提供搜尋子目錄下的build配置檔案,並根據命令列指定的目標來執行操作。為了避免出現死迴圈,加上了 exclude 命令。
對於諸多小檔案的目錄,採用每個原始碼檔案編譯成一個可執行程式的策略。最開始沒有采用通配的方法,直接針對每個檔案寫命令。
<?xml version="1.0"?> <project name="Math" default="run"> <property name="debug" value="true" /> <target name="clean" description="remove all generated files"> <!-- Files: '*.xml; *.pdb' --> <delete> <fileset> <include name="*.xml" /> <include name="*.exe" /> </fileset> </delete> <delete file="oledb.exe" /> </target> <target name="build" description="compiles the source code"> <csc debug="${debug}" output="helloMath.exe" target="exe" win32icon="..\ico\triple.ico"> <sources> <include name="helloMath.cs" /> </sources> </csc> </target> <target name="run" depends="build"> <exec program="helloMath.exe" /> </target> </project>
檔案數量增加後,寫命令的工作量就變得驚人了。想想辦法,如何才能多快好省呢?
<?xml version="1.0"?> <project name="xml" default="run"> <property name="debug" value="true" /> <target name="clean" description="remove all generated files"> <!-- Files: '*.xml; *.pdb' --> <delete> <fileset> <include name="*.xml" /> <include name="*.exe" /> <include name="*.pdb" /> </fileset> </delete> </target> <target name="build" description="compiles the source code"> <foreach item="File" property="filename"> <in> <items> <include name="*.cs" /> </items> </in> <do> <echo message="${filename}" /> <csc debug="${debug}" output="${path::change-extension(filename, 'exe')}" target="exe"> <sources> <include name="${filename}" /> </sources> </csc> </do> </foreach> </target> <target name="run" depends="build"> <foreach item="File" property="filename"> <in> <items> <include name="*.exe" /> </items> </in> <do> <echo message="${filename}" /> <exec program="${filename}" /> </do> </foreach> </target> </project>
現在每個檔案都能進行編譯了。就算增加更多的檔案,也不需要修改配置檔案。暫時就到這裡,之後還會遇到其他的問題,比如DLL如何處理,C/C++程式碼如何處理,第三方庫檔案如何處理等等,待有時間慢慢道來。