2014-12-07 57 views
1

假設我有一個元數據的ItemGroup,需要一些時間來建立(10秒):我可以使用元數據緩存ItemGroup嗎?

<Target Name="BuildItemGroup"> 
    <ItemGroup> 
     <File Include="5"> 
      <Value>5a</Value> 
     </File> 
     <File Include="4"> 
      <Value>4a</Value> 
     </File> 
     ... 
    </ItemGroup> 
    <Message Text="Wait 10 seconds..." Importance="High" /> 
</Target> 

,我會使用相同的ItemGroup幾次在遞歸MSBuild任務:

<Target Name="Recursive" DependsOnTargets="BuildItemGroup" Condition="$(Value) > 0" > 
    <PropertyGroup> 
     <Value>$([MSBuild]::Subtract($(Value), 1))</Value> 
    </PropertyGroup> 

    <MSBuild Projects="$(MSBuildProjectFile)" Targets="Recursive" Properties="Value=$(Value)" /> 
</Target> 

<PropertyGroup> 
    <Value>5</Value> 
</PropertyGroup> 

<Target Name="Default" DependsOnTargets="Recursive" /> 

需要額外的40秒完成Recursive任務的4個循環。有沒有辦法以這種方式緩存ItemGroup的循環使用?

回答

1

不,調用MSBuild任務將創建新的上下文,它將重新評估所有屬性和項目。 您可以使用在父\子上下文之間傳遞數據的唯一方法是屬性(以及成爲全局屬性的環境變量)。

取決於此列表的大小 - 您可以嘗試將它作爲屬性傳遞(丟失元數據)並在子msbuild上下文中重新創建itemgroup。或者您可以使用C#和d切換到內嵌任務,並且您可以隨意使用完整的C#功能 - 例如,將數據保存到磁盤並從文件中讀回。

更新:最後我做了這樣的內聯任務。實際上這是一對要保存的任務,另一個是從磁盤加載持久保存的項目。有點難看的代碼 - 我必須爲Item和元數據類創建一個可序列化的副本。但作爲PoC,它已經足夠好了。不能保證它可以安全地在多線程環境中工作,尤其是對於您的200多個項目。 See the code in this repository

+0

是否有可以將ItemGroup +元數據寫入文件的準備使用任務?並從該文件讀取到ItemGroup? – 2014-12-08 00:49:09

+0

:)我不知道一個。我可以試着把它們綁在一起(因爲我可以看到你不是C#開發人員,對嗎?)但今天絕對不會發生,並且不知道明天會發生什麼。你可以等待或問這個 - 也許有人已經準備好了手上的東西 – 2014-12-08 01:56:42

+0

對不起,這麼久 - 看到我的答案更新。任務定義後樣本目標中包含的用法 – 2014-12-16 11:44:12

相關問題