这应该不是一个特别困难的练习。我们在我的一个项目中做了一些非常相似的事情,因为其中一半在 Java 上运行,使用 Ant 来运行相关目标,另一半是用于 UI 的 .Net (C#)。项目在 Windows 机器上运行以进行开发,但服务器(Java)运行 linux,但在 UAT 环境(linux)中,我们需要运行 nunits(集成测试)。这背后的真正技巧(不是真正的技巧)是拥有一个可以在两种环境中运行的 NAnt 构建文件,这似乎与您在这里尝试做的事情相同。
当然你意识到你需要先在 Mono 上安装 NAnt:
$ 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 tortoise 等)
有关 Mono 上 Nunit 等的更多帮助,请查看这篇精彩的帖子。
希望有帮助,
干杯,
抢G