2008-08-28 45 views
6

Tôi mới sử dụng NAnt nhưng có một số kinh nghiệm với Ant và CruiseControl.Xây dựng nền tảng NAnt và nền tảng kép - cách tốt nhất để xây dựng trên Windows AND Mono/Linux

Những gì tôi muốn làm là có dự án SVN của tôi bao gồm tất cả các công cụ cần thiết (như NUnit và Mocks, vv) để tôi có thể kiểm tra trên một máy mới và xây dựng. Chiến lược này được vạch ra bởi J.P Boodhoo here.

Cho đến nay rất tốt nếu tôi chỉ muốn chạy trên Windows, nhưng tôi muốn có thể xem trên Linux và xây dựng/kiểm tra/chạy với Mono. Tôi không muốn phụ thuộc bên ngoài dự án SVN. Tôi không nhớ có hai bộ công cụ trong dự án nhưng chỉ muốn một tệp xây dựng NAnt

Điều này phải có thể - nhưng làm cách nào? các thủ thuật/'bẫy cho cầu thủ trẻ'

Trả lời

8

Đây không phải là một bài tập đặc biệt khó khăn. Chúng tôi thực hiện một số công cụ tương tự trên một trong các dự án của tôi vì một nửa trong số đó chạy trên Java bằng cách sử dụng Ant để chạy các mục tiêu có liên quan và một nửa còn lại là .Net (C#) cho giao diện người dùng. Các dự án chạy trên các máy Windows để phát triển, nhưng các máy chủ (Java) chạy Linux, nhưng trong môi trường UAT (linux) chúng ta cần chạy các nunits (các bài kiểm tra tích hợp). Bí quyết thực sự (không thực sự là một thủ thuật khó khăn) đằng sau này là có một tập tin xây dựng NAnt có thể chạy trong cả hai môi trường mà có vẻ là cùng một điều bạn đang cố gắng làm ở đây.

Tất nhiên bạn nhận ra rằng bạn sẽ cần phải cài đặt Nant trên Mono đầu tiên:

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

Và sau đó xây dựng hồ sơ của bạn cần phải được viết bằng một cách như vậy mà nó seperates lo ngại. Một số phần của tệp xây dựng được viết cho các cửa sổ sẽ không hoạt động trong linux chẳng hạn. Vì vậy, bạn thực sự chỉ cần phân chia nó lên các mục tiêu cụ thể trong tệp xây dựng. Sau đó, có một số cách bạn có thể chạy một mục tiêu cụ thể từ dòng lệnh. Ví dụ có thể trông giống như sau:

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

Vì ngắn gọn, tôi đã để cả hai mặt ra. Điều gọn gàng là bạn có thể sử dụng NUnit cũng như NAnt trên cả hai môi trường và điều đó làm cho mọi việc thực sự dễ dàng từ một quan điểm phụ thuộc. Và đối với mỗi tệp thi hành, bạn có thể trao đổi cho những người khác làm việc trong môi trường đó, ví dụ (xBuild cho MSBuild và svn cho rùa vv)

Để được trợ giúp thêm về Nunit, v.v. hãy xem this fantastic post.

Hy vọng rằng sẽ giúp,

Chúc mừng,

Rob G

1

Điều đáng chú ý là rất nhiều các công cụ như Nant chạy trên mono 'ra khỏi hộp', tức là

mono nant.exe 

hoạt động

2

@Rob G - Hey! Đó là bài của tôi! ;)

Đối với một số ví dụ hay khác, hãy đảm bảo duyệt mã nguồn NUnit. Tôi làm việc chặt chẽ với Charlie bất cứ khi nào tôi có thể để đảm bảo rằng nó đang xây dựng và thử nghiệm trên Mono. Anh cố gắng chạy bất cứ khi nào anh có thể.

0

Tôi sử dụng mẫu sau. Nó cho phép xây dựng đơn giản trên bất kỳ nền tảng nào (build trên Win hoặc ./build.sh trên Linux) và giảm thiểu sự sao chép trong các tập lệnh xây dựng.


Bản thực thi NAnt được lưu trữ với dự án trong tools\nant.

Tệp cấu hình xây dựng xác định công cụ xây dựng nào cần sử dụng, MSBuild hoặc xbuild (trong trường hợp này, dành cho Windows tôi yêu cầu phiên bản MSBuild VS2015, thay đổi đường dẫn theo yêu cầu).

Mục tiêu xây dựng build-csproj có thể được sử dụng lại khi bạn có nhiều dự án trong một giải pháp.

Mục tiêu test-project cần được mở rộng theo nhu cầu của bạn.

build.bat

@tools\nant\nant.exe %* 

build.sh

#!/bin/sh 

/usr/bin/cli tools/nant/NAnt.exe "[email protected]" 

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> 
Các vấn đề liên quan