2008-08-28 63 views
6

我是NAnt的新手,但對Ant和CruiseControl有一些經驗。NAnt和雙平臺構建 - 在Windows和Mono/Linux上構建的最佳方式

我想要做的是讓我的SVN項目包括所需的所有工具(如NUnit和Mocks等),以便我可以檢查到新機器上並構建。這個策略是由J.P Boodhoo提出的here.

到目前爲止,如果我只想運行在Windows上,但我希望能夠在Linux上運行並且可以在Mono上構建/測試/運行。我不需要SVN項目外部的依賴關係。我不介意在項目中有兩套工具,但只需要一個NAnt構建文件

這一定是可能的 - 但是如何?什麼是技巧/'年輕球員的陷阱'

回答

8

這不應該是一個特別困難的練習。在我的一個項目中,我們做了一些相當類似的工作,因爲它的一半運行在使用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 &quot;ClientCoverage.xml&quot;" /> 
     <arg value="&quot;C:\Program Files\NUnit-Net-2.0 2.2.8\bin 
         \nunit-console.exe&quot; 
         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

希望幫助,

乾杯,

羅布摹

1

值得注意的是,很多像單南特運行「開箱即用」的工具,即

mono nant.exe 

作品

2

@Rob G - 嘿!這是我的帖子! ;)

對於其他一些很好的例子,一定要瀏覽NUnit源代碼。只要我能確定它正在Mono上進行構建和測試,我就會與Charlie密切合作。他儘可能地嘗試跑步。

0

我使用以下模板。它允許在任何平臺上簡單構建(在Win上爲build或在Linux上爲./build.sh)並最小化構建腳本中的重複。


NAnt可執行文件與tools\nant中的項目一起存儲。

構建配置文件決定使用哪個構建工具,MSBuild或xbuild(在這種情況下,對於Windows,我需要VS2015 MSBuild版本,根據需要更改路徑)。

build-csproj構建目標可重複使用的,當你有一個解決方案中的多個項目。

test-project目標需要根據您的需求進行擴展。

的build.bat

@tools\nant\nant.exe %* 

build.sh

#!/bin/sh 

/usr/bin/cli tools/nant/NAnt.exe "[email protected]" 

default.build

<?xml version="1.0"?> 
<project name="MyProject" default="all"> 

    <if test="${not property::exists('configuration')}"> 
    <property name="configuration" value="release" readonly="true" /> 
    </if> 

    <if test="${platform::is-windows()}"> 
    <property name="BuildTool" value="C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" readonly="true"/> 
    </if> 
    <if test="${platform::is-unix()}"> 
    <property name="BuildTool" value="xbuild" readonly="true"/> 
    </if> 

    <property name="TestTool" value="tools/mytesttool.exe"/> 

    <target name="all" depends="myproject myprojectlib" /> 

    <target name="build-csproj" description="Build a given csproj"> 
    <!-- Must not be called standalone as it requires some properties set. --> 
    <exec program="${BuildTool}"> 
     <arg path="src/${ProjectName}/${ProjectName}.csproj" /> 
     <arg line="/property:Configuration=${configuration}" /> 
     <arg value="/target:Rebuild" /> 
     <arg value="/verbosity:normal" /> 
     <arg value="/nologo" /> 
    </exec> 
    </target> 

    <target name="test-project"> 
    <!-- Must not be called standalone as it requires some properties set. --> 
    <exec program="${TestTool}"> 
     <arg path="my/${ProjectName}/tests/path/for/tool" /> 
     <arg value="/aproperty=value" /> 
    </exec> 
    </target> 

    <target name="myproject" description="Build the project"> 
    <property name="ProjectName" value="MyProject"/> 
    <call target="build-csproj" /> 
    <call target="test-project" /> 
    </target> 

    <target name="myprojectlib" description="Build the project's library dll"> 
    <property name="ProjectName" value="MyProjectLib"/> 
    <call target="build-csproj" /> 
    <call target="test-project" /> 
    </target> 

</project>