Сборка NAnt и двойной платформы - лучший способ сборки на Windows И Mono / Linux

Я новичок в NAnt, но имею некоторый опыт работы с Ant и CruiseControl.

Я хочу, чтобы мой проект SVN включал все необходимые инструменты (например, NUnit, Mocks и т. Д.), Чтобы я мог проверить на новой машине и собрать. Эта стратегия изложена Дж. П. Буду, здесь.

Пока все хорошо, если я хочу работать только в Windows, но я хочу иметь возможность проверять Linux и создавать / тестировать / запускать также против Mono. Мне не нужны внешние зависимости от проекта SVN. Я не против иметь в проекте два набора инструментов, но хочу только один файл сборки NAnt.

Это должно быть возможно - но как? какие уловки / «ловушки для молодых игроков»


person Frep D-Oronge    schedule 28.08.2008    source источник


Ответы (4)


Это не должно быть особенно сложным упражнением. Мы делаем довольно похожие вещи в одном из моих проектов, поскольку половина из них работает на Java с использованием Ant для запуска соответствующих целей, а другая половина - это .Net (C #) для пользовательского интерфейса. Проекты запускаются на машинах с Windows для разработки, но серверы (Java) работают под Linux, но в среде UAT (Linux) нам нужно запускать nunits (интеграционные тесты). Настоящая уловка (на самом деле не сложная), стоящая за этим, заключается в наличии файла сборки NAnt, который может работать в обеих средах, что похоже на то, что вы пытаетесь сделать здесь.

Конечно, вы понимаете, что сначала вам нужно установить NAnt на Mono:

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

И затем ваш файл сборки должен быть написан таким образом, чтобы он разделял проблемы. Некоторые части файла сборки, написанные для Windows, например, не будут работать в Linux. Так что вам просто нужно разделить его на конкретные цели в файле сборки. После этого есть несколько способов запустить определенные цели из командной строки. Пример может выглядеть так:

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

Для краткости я не упомянул обе стороны. Самое интересное в том, что вы можете использовать NUnit, а также NAnt в обеих средах, и это действительно упрощает работу с точки зрения зависимости. И для каждого исполняемого файла вы можете заменить его на другие, которые работают в этой среде, например (xBuild для MSBuild, svn для черепахи и т. Д.)

Для получения дополнительной помощи по Nunit и т. Д. На Mono, ознакомьтесь с этим фантастическим опубликовать.

Надеюсь, это поможет,

Ваше здоровье,

Роб Джи

person RobertTheGrey    schedule 28.08.2008

@ Роб Джи - Привет! Это мой пост! ;)

Чтобы найти другие хорошие примеры, обязательно просмотрите исходный код NUnit. Я работаю в тесном контакте с Чарли, когда могу, чтобы убедиться, что он строится и тестируется на Mono. Он тоже пытается убежать, когда может.

person Cory Foy    schedule 05.09.2008

Стоит отметить, что многие инструменты, такие как Nant, работают в моно «из коробки», т.е.

mono nant.exe

работает

person Frep D-Oronge    schedule 05.09.2008

Я использую следующий шаблон. Это позволяет просто строить на любой платформе (build в Win или ./build.sh в Linux) и сводит к минимуму дублирование в сценариях сборки.


Исполняемый файл NAnt хранится вместе с проектом в tools\nant.

Файл конфигурации сборки определяет, какой инструмент сборки использовать: MSBuild или xbuild (в этом случае для Windows мне нужна версия VS2015 MSBuild, при необходимости измените путь).

Целевой объект сборки build-csproj можно повторно использовать, когда у вас есть несколько проектов в рамках одного решения.

Цель test-project должна быть расширена для ваших нужд.

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>
person Mark Bowker    schedule 14.01.2016