Pregunta

Soy nuevo en NAnt pero tengo algo de experiencia con Ant y CruiseControl.

Lo que quiero hacer es que mi proyecto SVN incluya todas las herramientas necesarias (como NUnit y Mocks, etc.) para poder verificar una máquina nueva y compilar.Esta estrategia está descrita por J.P Boodhoo. aquí.

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

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

¿Fue útil?

Solución

Este 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 usando Ant para ejecutar objetivos relevantes y la otra mitad es .Net (C#) para la interfaz de usuario.Los proyectos se ejecutan en máquinas con Windows para el desarrollo, pero los servidores (Java) ejecutan Linux, pero en el entorno UAT (linux) necesitamos ejecutar las nunits (pruebas de integración).El verdadero truco (no es realmente un truco difícil) detrás de esto es tener un archivo de compilación NAnt que pueda ejecutarse en ambos entornos, lo cual parece ser lo mismo que estás intentando hacer aquí.

Por supuesto, te das cuenta de que primero necesitarás instalar NAnt en Mono:

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

Y luego su archivo de compilación debe escribirse de tal manera que separe las preocupaciones.Algunas partes del archivo de compilación escrito para Windows no funcionarán en Linux, por ejemplo.Entonces, realmente solo necesita 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>

Para abreviar, he omitido ambos lados.Lo bueno es que puedes usar NUnit y NAnt en ambos entornos y eso hace que las cosas sean realmente fáciles desde el punto de vista de la dependencia.Y para cada ejecutable puedes intercambiarlo por otros que funcionen en ese entorno, por ejemplo (xBuild para MSBuild y svn para tortoise, etc.)

Para obtener más ayuda sobre Nunit, etc. en Mono, consulte esta fantástica publicación.

Espero que ayude,

Salud,

Rob G.

Otros consejos

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

Para ver otros buenos ejemplos, asegúrese de explorar el código fuente de NUnit.Trabajo estrechamente con Charlie siempre que puedo para asegurarme de que se esté construyendo y probando en Mono.También intenta correr siempre que puede.

Vale la pena señalar que muchas herramientas como Nant se ejecutan en mono "listas para usar", es decir.

mono nant.exe

obras

Utilizo la siguiente plantilla.Permite una construcción sencilla en cualquier plataforma (build en ganar o ./build.sh en Linux) y minimiza la duplicación en los scripts de compilación.


El ejecutable 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 VS2015 de MSBuild, cambie la ruta según sea necesario).

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

El test-project El objetivo debería ampliarse para sus necesidades.

construir.bat

@tools\nant\nant.exe %*

construir.sh

#!/bin/sh

/usr/bin/cli tools/nant/NAnt.exe "$@"

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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top