如何清除(也可能包括其他)ItemGroup中的项目?

时间:2013-04-18 17:34:20

标签: msbuild itemgroup

在我的构建过程中,我总是使用一种模式,其中某些任务旨在计算项目组中的项目列表,以及其他一些任务 create 物理对应物品。

这允许我通过执行增量构建来最小化构建时间。

在我们的一个项目中,我需要操纵ItemGroup中的项目。我的第一次尝试是首先清除ItemGroup的内容,然后将我感兴趣的内容重新包含在ItemGroup中。

然而,我偶然发现了一个对我没有意义的MSBuild行为。该问题仅在特定ItemGroup执行时尝试clear items from Target。也就是说,只有在分析了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(显然是一个接一个),那么上面示例代码的结果是{{1即使@(CustomItemGroup)未执行,也会返回空白状态。

我尝试使用遗留Target Name="CreateCustomItemGroup"方式来操纵CreateItem,但我找不到令人满意的答案。

有人可以建议解决方法吗?

1 个答案:

答案 0 :(得分:1)

您正面临“输出推理”,如http://msdn.microsoft.com/en-us/library/vstudio/ee264087%28v=vs.100%29.aspx

所述
  

目标没有过时的输出并被跳过。 MSBuild评估目标并对项目和属性进行更改,就像目标已经运行一样。

考虑重新设计逻辑以使用条件语句进行分配。