在我的构建过程中,我总是使用一种模式,其中某些任务旨在计算项目组中的项目列表,以及其他一些任务 create 物理对应物品。
这允许我通过执行增量构建来最小化构建时间。
在我们的一个项目中,我需要操纵ItemGroup
中的项目。我的第一次尝试是首先清除ItemGroup
的内容,然后将我感兴趣的内容重新包含在ItemGroup
中。
然而,我偶然发现了一个对我没有意义的MSBuild行为。该问题仅在特定ItemGroup
执行时尝试clear items from Target
。也就是说,只有在分析了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(显然是一个接一个),那么上面示例代码的结果是{{1即使@(CustomItemGroup)
未执行,也会返回空白状态。
我尝试使用遗留Target Name="CreateCustomItemGroup"
方式来操纵CreateItem
,但我找不到令人满意的答案。
有人可以建议解决方法吗?
答案 0 :(得分:1)
您正面临“输出推理”,如http://msdn.microsoft.com/en-us/library/vstudio/ee264087%28v=vs.100%29.aspx
所述目标没有过时的输出并被跳过。 MSBuild评估目标并对项目和属性进行更改,就像目标已经运行一样。
考虑重新设计逻辑以使用条件语句进行分配。