我在我的VC ++项目中使用VS2010自定义构建规则。在这个规则中,我希望允许用户添加复杂的条件来确定文件是否被处理。
此外,这也需要在目标执行时进行评估,而不是在“Item”的“Condition”中进行评估(因为只有“应用程序”项目可以处理它,并且需要使用“应用程序”项目的设置来处理它,而不是依赖项目)。
我尝试向对象添加自定义字段,然后在执行时仅从组中删除项目。 例如:
此外,这也需要在目标执行时进行评估,而不是在“Item”的“Condition”中进行评估(因为只有“应用程序”项目可以处理它,并且需要使用“应用程序”项目的设置来处理它,而不是依赖项目)。
我尝试向对象添加自定义字段,然后在执行时仅从组中删除项目。 例如:
<ItemGroup>
<MyItemType Remove="@(MyItemType)" Condition="!(%(MyItemType.IncludeCondition))" />
</ItemGroup>
不幸的是,这给了我一个错误:
error MSB4113:指定的条件“!(%(MyItemType.IncludeCondition))”评估为“!'testfilename1' == 'testfilename2'或false”,而不是布尔值。
(%(MyItemType.IncludeCondition)中的原始条件表达式为'%(Filename)'== 'testfilename2'或$(TestBooleanFalse)
)
看起来MSBuild不会将项目元数据评估为布尔值(在大多数情况下,这似乎是一个好的实践,但在这种情况下不是)。
是否有任何方法可以让MSbuild实际将元数据评估为布尔值,或者是否有其他方法可以使用以获得相同的结果?
P.S. 我已经简要查阅了 MSBuild 属性函数, 但没有看到任何可以在函数输入上运行 MSBuild 布尔评估代码的内容。
以下是Lanrokin提供的一个非常简化的MSBuild项目示例,展示了该问题:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
<ItemGroup>
<MyItemType Include="item1.ext1" />
<MyItemType Include="item1.ext2" />
</ItemGroup>
<Target Name="SpecifyConditions">
<ItemGroup>
<MyItemType>
<IncludeCondition>'%(Filename)%(Extension)' == 'item1.ext1'</IncludeCondition>
</MyItemType>
</ItemGroup>
</Target>
<Target Name="Build" DependsOnTargets="SpecifyConditions">
<Message Importance="high" Text="@(MyItemType)" Condition="%(MyItemType.IncludeCondition)" />
</Target>
</Project>