NAnt- und Dual-Plattform-Build – die beste Möglichkeit, auf Windows UND Mono/Linux zu bauen

StackOverflow https://stackoverflow.com/questions/32027

Frage

Ich bin neu bei NAnt, habe aber einige Erfahrung mit Ant und CruiseControl.

Ich möchte, dass mein SVN-Projekt alle benötigten Tools (wie NUnit und Mocks usw.) enthält, damit ich es auf eine neue Maschine testen und erstellen kann.Diese Strategie wird von J.P. Boodhoo beschrieben Hier.

So weit, so gut, wenn ich nur unter Windows laufen möchte, aber ich möchte auch in der Lage sein, Linux auszuprobieren und gegen Mono zu bauen/testen/laufen zu lassen.Ich möchte keine Abhängigkeiten außerhalb des SVN-Projekts.Es macht mir nichts aus, zwei Werkzeugsätze im Projekt zu haben, aber ich möchte nur eine NAnt-Build-Datei

Das muss möglich sein – aber wie?Was sind die Tricks / „Fallen für junge Spieler“

War es hilfreich?

Lösung

Dies sollte keine besonders schwierige Übung sein.Bei einem meiner Projekte machen wir einige ziemlich ähnliche Dinge, da die Hälfte davon auf Java mit Ant zum Ausführen relevanter Ziele läuft und die andere Hälfte .Net (C#) für die Benutzeroberfläche ist.Die Projekte werden zur Entwicklung auf Windows-Rechnern ausgeführt, aber auf den Servern (Java) läuft Linux, aber in der UAT-Umgebung (Linux) müssen wir die Nunits (Integrationstests) ausführen.Der eigentliche Trick (nicht wirklich ein schwieriger Trick) dahinter besteht darin, eine NAnt-Build-Datei zu haben, die in beiden Umgebungen ausgeführt werden kann, was anscheinend dasselbe ist, was Sie hier versuchen.

Natürlich ist Ihnen klar, dass Sie NAnt zuerst auf Mono installieren müssen:

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

Und dann muss Ihre Build-Datei so geschrieben sein, dass sie die Anliegen trennt.Einige Teile der für Windows geschriebenen Build-Datei funktionieren beispielsweise unter Linux nicht.Sie müssen es also wirklich nur auf bestimmte Ziele in der Build-Datei aufteilen.Danach gibt es eine Reihe von Möglichkeiten, wie Sie bestimmte Ziele über die Befehlszeile ausführen können.Ein Beispiel könnte so aussehen:

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

Der Kürze halber habe ich beide Seiten weggelassen.Das Schöne daran ist, dass Sie sowohl NUnit als auch NAnt in beiden Umgebungen verwenden können, was die Sache aus der Sicht der Abhängigkeiten wirklich einfach macht.Und für jede ausführbare Datei können Sie sie gegen andere austauschen, die in dieser Umgebung funktionieren, zum Beispiel (xBuild für MSBuild und svn für tortoise usw.).

Weitere Hilfe zu Nunit usw. auf Mono finden Sie hier dieser fantastische Beitrag.

Hoffentlich hilft das,

Prost,

Rob G

Andere Tipps

@Rob G – Hey!Das ist mein Beitrag!;)

Weitere gute Beispiele finden Sie im NUnit-Quellcode.Wann immer ich kann, arbeite ich eng mit Charlie zusammen, um sicherzustellen, dass es auf Mono erstellt und getestet wird.Er versucht auch zu rennen, wann immer er kann.

Es ist erwähnenswert, dass viele Tools wie Nant „out of the box“ auf Mono laufen, d. h.

mono nant.exe

funktioniert

Ich verwende die folgende Vorlage.Es ermöglicht den einfachen Aufbau auf jeder Plattform (build auf Win bzw ./build.sh unter Linux) und minimiert Duplikate in den Build-Skripten.


Die ausführbare NAnt-Datei wird mit dem Projekt gespeichert tools\nant.

Die Build-Konfigurationsdatei bestimmt, welches Build-Tool verwendet werden soll, entweder MSBuild oder xbuild (in diesem Fall benötige ich für Windows die VS2015-MSBuild-Version, ändern Sie den Pfad nach Bedarf).

Der build-csproj Das Build-Ziel kann wiederverwendet werden, wenn Sie mehrere Projekte in einer Lösung haben.

Der test-project Das Ziel müsste für Ihre Bedürfnisse erweitert werden.

build.bat

@tools\nant\nant.exe %*

build.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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top