Đây không phải là một bài tập đặc biệt khó khăn. Chúng tôi thực hiện một số công cụ tương tự trên một trong các dự án của tôi vì một nửa trong số đó chạy trên Java bằng cách sử dụng Ant để chạy các mục tiêu có liên quan và một nửa còn lại là .Net (C#) cho giao diện người dùng. Các dự án chạy trên các máy Windows để phát triển, nhưng các máy chủ (Java) chạy Linux, nhưng trong môi trường UAT (linux) chúng ta cần chạy các nunits (các bài kiểm tra tích hợp). Bí quyết thực sự (không thực sự là một thủ thuật khó khăn) đằng sau này là có một tập tin xây dựng NAnt có thể chạy trong cả hai môi trường mà có vẻ là cùng một điều bạn đang cố gắng làm ở đây.
Tất nhiên bạn nhận ra rằng bạn sẽ cần phải cài đặt Nant trên Mono đầu tiên:
$ export MONO_NO_UNLOAD=1
$ make clean
$ make
$ mono bin/NAnt.exe clean build
Và sau đó xây dựng hồ sơ của bạn cần phải được viết bằng một cách như vậy mà nó seperates lo ngại. Một số phần của tệp xây dựng được viết cho các cửa sổ sẽ không hoạt động trong linux chẳng hạn. Vì vậy, bạn thực sự chỉ cần phân chia nó lên các mục tiêu cụ thể trong tệp xây dựng. Sau đó, có một số cách bạn có thể chạy một mục tiêu cụ thể từ dòng lệnh. Ví dụ có thể trông giống như sau:
<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>
Vì ngắn gọn, tôi đã để cả hai mặt ra. Điều gọn gàng là bạn có thể sử dụng NUnit cũng như NAnt trên cả hai môi trường và điều đó làm cho mọi việc thực sự dễ dàng từ một quan điểm phụ thuộc. Và đối với mỗi tệp thi hành, bạn có thể trao đổi cho những người khác làm việc trong môi trường đó, ví dụ (xBuild cho MSBuild và svn cho rùa vv)
Để được trợ giúp thêm về Nunit, v.v. hãy xem this fantastic post.
Hy vọng rằng sẽ giúp,
Chúc mừng,
Rob G