在我的構建過程中,我總是使用一種模式,其中有些任務被設計爲計算項目組中的項目列表,以及其他一些任務創建物理對應項目。如何清除(並可能包含其他)來自ItemGroup的物品?
這使我可以通過執行增量構建來最小化構建時間。
在我們的一個項目中,我需要操縱ItemGroup
中的項目。我的第一次嘗試是首先清除ItemGroup
的內容,然後僅包含我對ItemGroup
重新感興趣的內容。
但是,我偶然發現了MSBuild的行爲,這對我沒有任何意義。該問題僅在執行特定的Target
時才嘗試clear items from和ItemGroup
。也就是說,只有在分析其Inputs
和Outputs
屬性後,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,但我找不到安全的答案。
任何人都可以提出一種解決方法嗎?
您的代碼段邏輯中的某些內容不會相加。 'CreateCustomItemGroup' _always_被執行,因爲沒有定義條件來告訴它不要。 – KMoraz
它不是*總是*執行。如果兩個文件都存在並且輸出文件比輸入文件更新,則CreateCustomItemGroup目標肯定是* not *執行。 –