NAnt et double plate-forme de l'accumulation de meilleure façon de construire sur Windows ET Mono/Linux

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

Question

Je suis nouveau sur NAnt, mais ont une certaine expérience avec les Fourmis et les CruiseControl.

Ce que je veux faire est de mon projet SVN inclure tous les outils nécessaires (comme NUnit et se moque etc) afin que je puisse vérifier sur une nouvelle machine et la construction.Cette stratégie est décrite par J. P Boodhoo ici.

C'est très bien que si je ne veux exécuter sur Windows, mais je veux être en mesure de vérifier sur Linux et construire/test/course contre la Mono aussi.Je ne veux pas de dépendances externes à l'SVN du projet.Je ne me dérange pas d'avoir deux ensembles d'outils dans le projet, mais ne veulent qu'une NAnt fichier de build

Ce doit être possible, mais comment?quelles sont les astuces / " pièges pour les jeunes joueurs

Était-ce utile?

La solution

Cela ne devrait pas être particulièrement difficile à exercer.Nous faisons quelques-uns assez les trucs similaires sur l'un de mes projets depuis la moitié des il fonctionne sur Java à l'aide de Fourmi pour exécuter des objectifs pertinents, et l'autre moitié est .Net (C#) pour l'INTERFACE utilisateur.Les projets s'exécuter sur des machines windows pour le développement, mais les serveurs (Java) le fonctionnement de linux, mais dans l'UAT de l'environnement (linux) nous avons besoin pour exécuter le nunits (tests d'intégration).Le vrai truc (pas vraiment difficile truc), derrière c'est d'avoir un NAnt fichier de build qui peut fonctionner dans les deux environnements qui semble être la même chose que vous essayez de faire ici.

Bien sûr, vous réalisez que vous aurez besoin pour installer NAnt sur Mono première:

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

Et puis, votre fichier doit être écrit de telle manière qu'il se sépare de ses préoccupations.Certaines parties de la construction du fichier écrites pour windows ne fonctionnera pas sous linux par exemple.Si vous avez vraiment besoin juste de diviser ito cibles spécifiques dans le fichier build.Après cela, il ya un certain nombre de façons dont vous pouvez exécuter un des objectifs spécifiques de la ligne de commande.Un exemple pourrait ressembler à ceci:

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

Par souci de concision, j'ai laissé les deux côtés.La chose intéressante est que vous pouvez utiliser NUnit ainsi que NAnt sur les deux environnements et qui rend les choses vraiment facile à partir d'une dépendance de point de vue.Et pour chaque fichier exécutable que vous pouvez échanger pour d'autres personnes qui travaillent dans cet environnement, par exemple (xBuild pour MSBuild, et le svn de tortue etc)

Pour en savoir plus sur Nunit etc Mono, découvrez ce poste fantastique.

Hope qui aide,

Cheers,

Rob G

Autres conseils

@Rob G - Hé!C'est mon post!;)

Pour certains autres bons exemples, assurez-vous de parcourir le NUnit code source.Je travaille en étroite collaboration avec Charlie à chaque fois que je peux vous assurer qu'elle est de construire et de tester sur Mono.Il tente d'exécuter chaque fois qu'il le peut.

Il est intéressant de noter qu'un grand nombre d'outils comme Nant exécuter sur mono 'out of the box', c'est à dire

mono nant.exe

fonctionne

J'utilise le modèle suivant.Il permet la construction sur n'importe quelle plateforme (build sur Win ou ./build.sh sur linux) et en minimisant la duplication dans les scripts de construction.


Le NAnt exécutable est stocké avec le projet de tools\nant.

Le build fichier de configuration détermine l'outil de génération pour utiliser, soit MSBuild ou xbuild (dans ce cas, pour Windows j'ai besoin de la VS2015 MSBuild version, changer le chemin d'accès, comme l'exige).

L' build-csproj construire la cible peuvent être réutilisés pour quand vous avez plusieurs projets au sein d'une solution.

L' test-project la cible doit être élargi pour répondre à vos besoins.

construire.chauve-souris

@tools\nant\nant.exe %*

build.sh

#!/bin/sh

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

par défaut.construire

<?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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top