2014-12-07 83 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

相关问题