如何在VS2010中公开MSBuild"条件"(对于vc ++)

Gra*_*ers 5 msbuild visual-studio-2010 visual-c++ msbuild-4.0

我在VS2010中为我的VC++项目设置了自定义构建规则.在此规则中,我想允许用户在是否处理文件时添加复杂条件.

这也需要在目标执行时而不是在"项目"本身的"条件"中进行评估(由于只有'应用程序'项目可以处理它并且需要使用'应用'项目,而不是依赖项目).

我已经尝试向对象添加自定义字段,然后在执行时只删除组中的项目.例如

<ItemGroup>
    <MyItemType Remove="@(MyItemType)" Condition="!(%(MyItemType.IncludeCondition))" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

不幸的是,这给了我错误:

错误MSB4113:指定条件"!(%(MyItemType.IncludeCondition))"评估为"!'testfilename1'=='testfilename2'或false"而不是布尔值.

('%(MyItemType.IncludeCondition)'中的原始条件表达式是'%(Filename)' == 'testfilename2' or $(TestBooleanFalse))

看起来好像MSBuild不会将项元数据的内容评估为布尔值(在大多数情况下这似乎是很好的做法,而不是这个).

无论如何我可以让MSbuild实际将元数据评估为布尔值,还是有其他方法可以用来获得相同的结果?


PS我已经简要了解了MSBuild 属性函数,但是看不到任何会在函数输入上运行MSBuild布尔评估代码的东西)


一个非常精简的MSBuild项目示例显示了这个问题,由Lanrokin提供:

<?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>
Run Code Online (Sandbox Code Playgroud)

KMo*_*raz 0

尝试内联声明条件而不是项目元数据:

 <ItemGroup>
    <MyItemType Remove="@(MyItemType)" Condition="('%(MyItemType.Filename)' == 'testfilename2')" />
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

Property Functions或者在元数据条件中使用:

<Target Name="SpecifyConditions">
    <ItemGroup>
        <MyItemType>
            <IncludeCondition>$([System.String]::Equals('%(Filename)%(Extension)', 'item1.ext1'))</IncludeCondition>
        </MyItemType>
    </ItemGroup>
</Target>

<Target Name="Build" DependsOnTargets="SpecifyConditions">
    <Message Importance="high" Text="@(MyItemType)" Condition="%(MyItemType.IncludeCondition)" />
</Target>
Run Code Online (Sandbox Code Playgroud)