Domanda

Sono nuovo di NAnt, ma hanno una certa esperienza con la Formica e CruiseControl.

Quello che voglio fare è di avere il mio SVN progetto include tutti gli strumenti necessari (come NUnit e Deride ecc) in modo che io possa controllare su di una fresca macchina e costruire.Questa strategia, delineata da J. P Boodhoo qui.

Finora tutto bene se voglio solo eseguito su Windows, ma voglio essere in grado di controllare su Linux e costruire/test/corsa contro il Mono troppo.Non voglio dipendenze esterne al SVN del progetto.Non mi dispiacerebbe avere due set di strumenti in progetto, ma vuole solo una NAnt file di build

Questo deve essere possibile, ma come?quali sono i trucchi / 'trappole per i giovani'

È stato utile?

Soluzione

Questo non dovrebbe essere particolarmente difficile esercizio.Facciamo un po ' abbastanza simile roba su uno dei miei progetti dal momento che la metà di esso gira su Java usando Ant esecuzione di obiettivi rilevanti, e l'altra metà è .Net (C#) per l'interfaccia utente.I progetti eseguiti su macchine windows per lo sviluppo, ma il server (Java) eseguire linux, ma in UAT ambiente (linux) abbiamo bisogno di eseguire il nunits (test di integrazione).Il vero trucco (non proprio una difficile presa) alla base di questo è di avere un NAnt costruire file che può essere eseguito in entrambi gli ambienti che sembra essere la stessa cosa che stiamo cercando di fare qui.

Naturalmente ti rendi conto che avrai bisogno di installare NAnt Mono primo:

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

E allora la build file deve essere scritto in modo tale che separa le preoccupazioni.Alcune parti del file di build scritti per windows non funziona con linux, per esempio.Quindi, è davvero solo bisogno di suddividere ito, gli obiettivi specifici il file di build.Dopo di che, ci sono un certo numero di modi che si possono eseguire specifici obiettivi da riga di comando.Un esempio potrebbe essere simile a questo:

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

Per ragioni di brevità, ho lasciato entrambe le parti fuori.La cosa interessante è che si può usare NUnit nonché NAnt in entrambi gli ambienti, e che rende le cose molto facili da una dipendenza da un punto di vista.E per ogni eseguibile che si può scambiare per altri che lavorano in quell'ambiente, per esempio (xBuild per MSBuild, e svn per la tartaruga ecc)

Per ulteriori informazioni su Nunit ecc Mono, check-out questo post fantastico.

Speranza che aiuta,

Ciao

Rob G

Altri suggerimenti

@Rob G - Ehi!Questo è il mio post!;)

Per alcuni altri esempi, essere sicuri di navigare in NUnit codice sorgente.Io lavoro a stretto contatto con Charlie ogni volta che posso per assicurarsi che si sta costruendo e testando su Mono.Egli tenta di eseguire ogni volta che può.

Vale la pena notare che un sacco di strumenti come Nant eseguire mono e di 'out of the box", cioè

mono nant.exe

funziona

Io uso il seguente modello.Esso permette di costruire su qualsiasi piattaforma (build su Win o ./build.sh su linux) e riduce al minimo la duplicazione nella creazione di script.


NAnt eseguibile è memorizzato il progetto in tools\nant.

La generazione del file di configurazione determina quali strumenti utilizzare, sia MSBuild o xbuild (in questo caso, per Windows io ho bisogno di VS2015 MSBuild versione, modifica il percorso come richiesto).

Il build-csproj costruire destinazione può essere riutilizzato per quando si hanno più progetti all'interno di una soluzione.

Il test-project target dovrebbe essere ampliato per le tue esigenze.

costruire.bat

@tools\nant\nant.exe %*

build.sh

#!/bin/sh

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

default.costruire

<?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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top