これは特に難しい演習ではありません。プロジェクトの半分は Ant を使用して Java で実行され、関連するターゲットを実行し、残りの半分は UI 用の .Net (C#) であるため、私のプロジェクトの 1 つでかなり似たようなことを行います。プロジェクトは開発用に 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 を使用できることです。これにより、依存関係の観点から非常に簡単になります。また、実行可能ファイルごとに、その環境で動作する他のものと交換できます (MSBuild の場合は xBuild、亀の場合は svn など)。
Mono の Nunit などについて詳しくは、この素晴らしい投稿をご覧ください。
それが役立つことを願って、
乾杯、
ロブ G