2011-07-18 76 views
5

我在使用MSBuild腳本創建的項目組範圍方面存在一些問題。基本上,我想要做的是有兩個不同的目標 - 我們稱之爲RunUnitTestsRunIntegrationTests - 生成一個名爲TestAssemblies的項目組,然後調用RunTests,它使用TestAssemblies來確定從哪個組件運行測試。MsBuild:使用CallTarget傳遞ItemGroup

單元測試和集成測試的兩個不同目標都取決於構建目標,並從中獲取具有所有編譯程序集的項目組,但由於RunTests目標將從不同位置調用,因此它不能真正依賴於的任何一方。因此,我需要以某種方式將物品組傳遞給普通的testrunner目標。但是,這似乎是不可能的,因爲對目標中項目組的更改似乎只能在該目標內工作。

我見過theseposts,但他們只似乎證實了我的恐懼,並建議DependsOnTarget作爲一種解決方法 - 這不會爲我工作,因爲我需要從不同的運行不同地方的項目。

這是我到目前爲止有:

<Target Name="RunAllTests" DependsOnTarget="BuildProject"> 
    <!-- In here, items created in BuildProject are available. --> 
    <CallTarget Targets="RunUnitTests;RunIntegrationTests"> 
</Target> 

<Target Name="RunUnitTests" DependsOnTarget="BuildProject"> 
    <!-- In here, items created in BuildProject are available. --> 
    <!-- One of those is @(UnitTestAssemblies) --> 

    <CreateItem Include="@(UnitTestAssemblies)"> 
     <Output TaskParameter="Include" ItemName="TestAssemblies" /> 
    </CreateItem> 

    <CallTarget Targets="RunTests" /> 
</Target> 

<!-- Then there's a similar target named RunIntegrationTests, which does the 
    same as RunUnitTests except it includes @(IntegrationTestAssemblies) --> 

<Target Name="RunTests"> 
    <!-- Here, I'd like to access @(TestAssemblies) and pass them to the NUnit 
     task, but they have fallen out of scope. --> 
</Target> 

有沒有解決這個辦法,或將我徹底調整自己的構建腳本?

+0

@ThomasGerstendörfer:請看看我更新的簡化版本我當前構建腳本。 –

回答

13

更改目標中的項目組只能看到其他目標後更改目標退出。因此,要獲得試件粘列表中,您可能需要實際移動設置的目標,以它自己的目標,如下:

<Target Name="PrepareUnitTestList" DependsOnTarget="BuildProject"> 
    <ItemGroup> 
    <TestAssemblies Include="@(UnitTestAssemblies)"/> 
    </ItemGroup> 
</Target> 

<Target Name="RunUnitTests" DependsOnTargets="PrepareUnitTestList"> 
    <CallTarget Targets="RunTests"/> 
</Target> 

<Target Name="RunTests"> 
    <Message Text="Test: %(TestAssemblies.Identity)"/> 
</Target> 
+0

通過一些重新構造,我能夠以這種方式解決問題。謝謝! –

+0

也許你可以通過重組來改進這個答案......我非常確定RunTests被調用一次,並且MessageAs每個TestAssembly被調用一次。 –

2

在「MSBuild」任務中,您可以將屬性傳遞給目標,但我不確定它是否適用於ItemGroup。但是你一定可以通過配料來完成 - 一次只能通過一個裝配。

<Target Name="RunUnitTests"> 
    <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="RunTests" Properties="TestAssemblies=%(TestAssemblies.Identity)"/> 
</Target> 

這將在運行時間只有一個組件「RunTests」,所以如果你在運行測試的時候需要的其他組件所知,這將是無用的。但也許它會給出一些更好的想法如何解決這個問題...

+0

我考慮過這一點,但也意識到我希望總共收集測試結果,而不僅僅是每個程序集,所以這不是一個選項。 –

相關問題