2013-04-18 17 views
2

在我的構建過程中,我總是使用一種模式,其中有些任務被設計爲計算項目組中的項目列表,以及其他一些任務創建物理對應項目。如何清除(並可能包含其他)來自ItemGroup的物品?

這使我可以通過執行增量構建來最小化構建時間。

在我們的一個項目中,我需要操縱ItemGroup中的項目。我的第一次嘗試是首先清除ItemGroup的內容,然後僅包含我對ItemGroup重新感興趣的內容。

但是,我偶然發現了MSBuild的行爲,這對我沒有任何意義。該問題僅在執行特定的Target時才嘗試clear items fromItemGroup。也就是說,只有在分析其InputsOutputs屬性後,MSBuild纔會確定必須執行Target

下面是一個最小的代碼段重現我的問題:

<Target Name="ComputeCustomItemGroup"> 
    <CreateItem Include="C:\Temp\fichier1.ext;C:\Temp\fichier2.ext;"> 
     <Output TaskParameter="Include" ItemName="CustomItemGroup" /> 
    </CreateItem> 
    </Target> 

    <Target Name="CreateCustomItemGroup" DependsOnTargets="ComputeCustomItemGroup" 
      Inputs="C:\Temp\input" 
      Outputs="C:\Temp\output"> 
    <Message Text="Creating custom item group..." /> 
    <!-- Would like the ability to clear item group *ONLY* when the target is executed --> 
    <!-- But this clears the item group every time it appears in the dependency chain of a currently executing target ! --> 
    <ItemGroup> 
     <CustomItemGroup Remove="@(CustomItemGroup)" /> 
    </ItemGroup> 
    </Target> 

    <Target Name="CustomTarget" DependsOnTargets="CreateCustomItemGroup"> 
    <Message Text="Executing Custom Target..." /> 
    <!-- Here, @(CustomItemGroup) is always empty... --> 
    <Message Text="CustomItemGroup: @(CustomItemGroup)" /> 
    </Target> 

    <Target Name="Build" DependsOnTargets="CustomTarget" /> 

</Project> 

在上面的代碼示例中,@(CustomItemGroup)初始設置爲含有幾個文件路徑的集合。沒關係。

現在,如果您創建兩個文件,在以下位置C:\ Temp \ input和C:\ Temp \ output(顯然是一個接一個),那麼上面的示例代碼的結果是@(CustomItemGroup)儘管沒有執行Target Name="CreateCustomItemGroup",但回空。

我試過使用傳統CreateItem的方式來操作ItemGroup s,但我找不到安全的答案。

任何人都可以提出一種解決方法嗎?

+0

您的代碼段邏輯中的某些內容不會相加。 'CreateCustomItemGroup' _always_被執行,因爲沒有定義條件來告訴它不要。 – KMoraz

+1

它不是*總是*執行。如果兩個文件都存在並且輸出文件比輸入文件更新,則CreateCustomItemGroup目標肯定是* not *執行。 –

回答

1

您在這裏http://msdn.microsoft.com/en-us/library/vstudio/ee264087%28v=vs.100%29.aspx

目標描述面臨着「輸出推理」了出來過期沒有輸出和被跳過。 MSBuild評估目標並對項目和屬性進行更改,就好像目標已經運行一樣。

考慮重新設計您的邏輯以使用條件語句進行分配。

+0

謝謝,這正是我的問題。這個特性非常有意義,它可以讓我簡化一些邏輯。在這個特定的實例中,我最終修改了作爲ComputeXXX目標的一部分的自定義任務運行,以獲得運行CreateXXX目標時所獲得的相同信息。如果這是有道理的... –

相關問題