這不應該是一個特別困難的練習。在我的一個項目中,我們做了一些相當類似的工作,因爲它的一半運行在使用Ant的Java上運行相關目標,另一半則是用於UI的.Net(C#)。這些項目運行在Windows機器上進行開發,但服務器(Java)運行linux,但在UAT環境(linux)中,我們需要運行nunits(集成測試)。真正的技巧(不是一個很難的技巧)背後有一個NAnt構建文件,可以在這兩種環境中運行,這似乎是你在這裏嘗試做的同樣的事情。
當然你意識到你需要先在Mono安裝楠:
$ export MONO_NO_UNLOAD=1
$ make clean
$ make
$ mono bin/NAnt.exe clean build
然後生成文件需要在它的方式隔開關注這樣的方式來寫。例如,爲Windows編寫的構建文件的某些部分在Linux中不起作用。所以你真的只需要在構建文件中將它分成特定的目標。之後,您可以通過多種方式從命令行運行特定的目標。一個例子可能是這樣的:
<project name="DualBuild">
<property name="windowsDotNetPath" value="C:\WINDOWS\Microsoft.NET\Framework\v3.5" />
<property name="windowsSolutionPath" value="D:\WorkingDirectory\branches\1234\source" />
<property name="windowsNUnitPath" value="C:\Program Files\NUnit-Net-2.0 2.2.8\bin" />
<property name="monoPath" value="You get the idea..." />
<target name="BuildAndTestOnWindows" depends="WinUpdateRevision, WinBuild, WinTest" />
<target name="BuildAndTestOnLinux" depends="MonoUpdateRevision, MonoBuild, MonoTest" />
<target name="WinUpdateRevision">
<delete file="${windowsSolutionPath}\Properties\AssemblyInfo.cs" />
<exec program="subwcrev.exe" basedir="C:\Program Files\TortoiseSVN\bin\"
workingdir="${windowsSolutionPath}\Properties"
commandline="${windowsSolutionPath} .\AssemblyInfoTemplate.cs
.\AssemblyInfo.cs" />
<delete file="${windowsSolutionPath}\Properties\AssemblyInfo.cs" />
<exec program="subwcrev.exe" basedir="C:\Program Files\TortoiseSVN\bin\"
workingdir="${windowsSolutionPath}\Properties"
commandline="${windowsSolutionPath} .\AssemblyInfoTemplate.cs
.\AssemblyInfo.cs" />
</target>
<target name="WinBuild">
<exec program="msbuild.exe"
basedir="${windowsDotNetPath}"
workingdir="${windowsSolutionPath}"
commandline="MySolution.sln /logger:ThoughtWorks.CruiseControl.MsBuild.XmlLogger,
ThoughtWorks.CruiseControl.MsBuild.dll;msbuild-output.xml
/nologo /verbosity:normal /noconsolelogger
/p:Configuration=Debug /target:Rebuild" />
</target>
<target name="WinTest">
<exec program="NCover.Console.exe"
basedir="C:\Program Files\NCover"
workingdir="${windowsSolutionPath}">
<arg value="//x "ClientCoverage.xml"" />
<arg value=""C:\Program Files\NUnit-Net-2.0 2.2.8\bin
\nunit-console.exe"
MySolution.nunit /xml=nunit-output.xml /nologo" />
</exec>
</target>
<target name="MonoUpdateRevision">
You get the idea...
</target>
<target name="MonoBuild">
You get the idea...
</target>
<target name="MonoTest">
You get the idea...
</target>
</project>
爲簡潔起見,我已將雙方都拋在了一邊。整潔的事情是,你可以在兩種環境中使用NUnit和NAnt,並且從依賴的角度來看,這使事情變得非常簡單。並且對於每個可執行文件,你可以換出在其他環境中工作的其他人,例如(xBuild for MSBuild,svn for tool等)
欲瞭解Mono上Nunit等的更多幫助,請查看this fantastic post。
希望幫助,
乾杯,
羅布摹