如何用NAnt管理單檔案程式倉庫

獨木發表於2013-09-04

因為學習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++程式碼如何處理,第三方庫檔案如何處理等等,待有時間慢慢道來。

 

 

相關文章