بناء منصة NAnt والمزدوجة - أفضل طريقة للبناء على نظامي التشغيل Windows وMono/Linux

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

سؤال

أنا جديد في NAnt ولكن لدي بعض الخبرة في استخدام Ant وCruiseControl.

ما أريد فعله هو أن يتضمن مشروع SVN الخاص بي جميع الأدوات اللازمة (مثل NUnit وMocks وما إلى ذلك) حتى أتمكن من التحقق من جهاز جديد وبناءه.تم توضيح هذه الإستراتيجية بواسطة جي بي بودهو هنا.

جيد جدًا حتى الآن إذا كنت أرغب في التشغيل على نظام التشغيل Windows فقط، ولكنني أريد أن أكون قادرًا على التحقق من Linux والإنشاء/الاختبار/التشغيل مقابل Mono أيضًا.لا أريد أي تبعيات خارجية لمشروع SVN.لا أمانع وجود مجموعتين من الأدوات في المشروع ولكني أريد ملف بناء NAnt واحد فقط

يجب أن يكون هذا ممكنا - ولكن كيف؟ما هي الحيل / "الفخاخ للاعبين الشباب"

هل كانت مفيدة؟

المحلول

لا ينبغي أن يكون هذا تمرينًا صعبًا بشكل خاص.نحن نقوم ببعض الأشياء المشابهة إلى حد ما في أحد مشاريعي حيث أن نصفها يعمل على Java باستخدام Ant لتشغيل الأهداف ذات الصلة، والنصف الآخر هو .Net (C#) لواجهة المستخدم.يتم تشغيل المشاريع على أجهزة Windows للتطوير، لكن الخوادم (Java) تعمل بنظام Linux، ولكن في بيئة UAT (linux) نحتاج إلى تشغيل الوحدات (اختبارات التكامل).الحيلة الحقيقية (ليست خدعة صعبة حقًا) وراء ذلك هي وجود ملف بناء 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 لـ tortoise وما إلى ذلك)

لمزيد من المساعدة حول Nunit وما إلى ذلك على Mono، راجع ذلك هذا المنصب الرائع.

امل ان يساعد،

هتافات،

روب ج

نصائح أخرى

@ روب جي - مرحبًا!هذا هو منصبي!;)

للحصول على بعض الأمثلة الجيدة الأخرى، تأكد من تصفح كود مصدر NUnit.أنا أعمل بشكل وثيق مع تشارلي كلما استطعت للتأكد من أنه يقوم بالبناء والاختبار على Mono.يحاول الركض كلما استطاع ذلك أيضًا.

ومن الجدير بالذكر أن الكثير من الأدوات مثل Nant تعمل على أحادية "خارج الصندوق"، أي.

mono nant.exe

يعمل

أستخدم القالب التالي.يسمح بالبناء البسيط على أي منصة (build على فوز أو ./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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top