2008-08-28 17 views
6

Soy nuevo en NAnt pero tengo alguna experiencia con Ant and CruiseControl.Creación de plataforma NAnt y dual: la mejor forma de compilar en Windows Y Mono/Linux

Lo que quiero hacer es hacer que mi proyecto SVN incluya todas las herramientas necesarias (como NUnit y Mocks, etc.) para poder consultar una máquina y construir nuevas. Esta estrategia es delineada por J.P Boodhoo here.

Hasta ahora todo bien si solo quiero ejecutar en Windows, pero también quiero poder verificar en Linux y construir/probar/ejecutar contra Mono también. No quiero dependencias externas al proyecto SVN. No me importa tener dos juegos de herramientas en el proyecto, pero solo quiero un archivo de construcción NAnt

Esto debe ser posible, pero ¿cómo? cuáles son los trucos/'trampas para jugadores jóvenes'

Respuesta

8

Esto no debería ser un ejercicio particularmente difícil. Hacemos algunas cosas bastante similares en uno de mis proyectos, ya que la mitad se ejecuta en Java utilizando Ant para ejecutar objetivos relevantes, y la otra mitad es .Net (C#) para la interfaz de usuario. Los proyectos se ejecutan en máquinas Windows para desarrollo, pero los servidores (Java) ejecutan Linux, pero en el entorno UAT (Linux) necesitamos ejecutar los nunits (pruebas de integración). El verdadero truco (que en realidad no es un truco difícil) es tener un archivo de compilación NAnt que se pueda ejecutar en ambos entornos, lo que parece ser lo mismo que intenta hacer aquí.

Por supuesto se da cuenta que tendrá que instalar de NAnt en Mono primera:

$ export MONO_NO_UNLOAD=1 
$ make clean 
$ make 
$ mono bin/NAnt.exe clean build 

Y entonces su fichero de construcción necesita ser escrita de tal manera que separa preocupaciones. Algunas partes del archivo de compilación escrito para Windows no funcionarán en Linux, por ejemplo. Entonces realmente solo necesitas dividirlo en objetivos específicos en el archivo de compilación. Después de eso, hay varias formas de ejecutar objetivos específicos desde la línea de comando. Un ejemplo podría verse así:

<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> 

Por brevedad, he dejado ambos lados. Lo bueno es que puedes usar NUnit y NAnt en ambos entornos, y eso hace las cosas realmente fáciles desde el punto de vista de la dependencia. Y para cada ejecutable puede cambiar para otros que trabajan en ese entorno, por ejemplo (xBuild para MSBuild y svn para tortuga, etc.)

Para obtener más ayuda sobre Nunit, etc. en Mono, consulte this fantastic post.

Espero que ayude,

Cheers,

Rob G

1

Vale la pena señalar que una gran cantidad de herramientas como Nant corrida de mono 'fuera de la caja', es decir

mono nant.exe 

funciona

2

@Rob G - Hey! Esa es mi publicación! ;)

Para algunos otros buenos ejemplos, asegúrese de examinar el código fuente de NUnit. Trabajo estrechamente con Charlie siempre que puedo para asegurarme de que está construyendo y probando en Mono. Él intenta correr cada vez que puede también.

0

Utilizo la siguiente plantilla. Permite la creación simple en cualquier plataforma (build en Win o ./build.sh en Linux) y minimiza la duplicación en los scripts de compilación.


El ejecutable de NAnt se almacena con el proyecto en tools\nant.

El archivo de configuración de compilación determina qué herramienta de compilación usar, ya sea MSBuild o xbuild (en este caso, para Windows, necesito la versión MSBuild VS2015, cambie la ruta según sea necesario).

El objetivo de compilación build-csproj se puede reutilizar para cuando tiene varios proyectos dentro de una solución.

El objetivo test-project debería ampliarse según sus necesidades.

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> 
Cuestiones relacionadas