5

VC++ プロジェクト用に VS2010 にカスタム ビルド ルールがあります。このルールでは、ユーザーがファイルを処理するかどうかについて複雑な条件を追加できるようにしたいと考えています。

これは、「アイテム」自体の「条件」ではなく、ターゲットの実行時に評価する必要もあります (「アプリケーション」プロジェクトのみがそれを処理でき、次の設定で処理する必要があるためです)。依存プロジェクトではなく、「アプリケーション」プロジェクト)。

オブジェクトにカスタム フィールドを追加してから、実行時にグループからアイテムを削除しようとしました。例えば

<ItemGroup>
    <MyItemType Remove="@(MyItemType)" Condition="!(%(MyItemType.IncludeCondition))" />
</ItemGroup>

残念ながら、これは私にエラーを与えます:

エラー MSB4113: 指定された条件 "!(%(MyItemType.IncludeCondition))" は、ブール値ではなく、"!'testfilename1' == 'testfilename2' または false" に評価されます。

('%(MyItemType.IncludeCondition)' の元の条件式は'%(Filename)' == 'testfilename2' or $(TestBooleanFalse))

MSBuild は、アイテム メタデータの内容をブール値に評価しないようです (これは、ほとんどの状況で適切な方法のように思われますが、この状況ではそうではありません)。

MSbuildで実際にメタデータをブール値まで評価できるようにする方法はありますか、それとも同じ結果を得るために使用できる他の方法はありますか?


PS MSBuild Property Functionsを簡単に調べましたが、関数入力に対して 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>
4

3 に答える 3

1

これは、MSBuild が評価する方法に関係しています。詳細については、Sayed の本を参照してください: Inside the Microsoft® Build Engine: Using MSBuild and Team Foundation Build

サンプル内の条件の位置を移動することで、達成しようとしていたと思われることを達成できます。

<Target Name="SpecifyConditions">
    <ItemGroup>
        <MyItemType Condition="'%(Filename)%(Extension)' == 'item1.ext1'">
            <IncludeCondition>true</IncludeCondition>
        </MyItemType>
    </ItemGroup>
</Target>

<Target Name="Build" DependsOnTargets="SpecifyConditions">
    <Message Importance="high" Text="@(MyItemType)" Condition="%(MyItemType.IncludeCondition) == 'true'" />
</Target>

于 2013-04-08T16:04:24.023 に答える
0

アイテムのメタデータではなく、条件をインラインで宣言してみてください。

 <ItemGroup>
    <MyItemType Remove="@(MyItemType)" Condition="('%(MyItemType.Filename)' == 'testfilename2')" />
  </ItemGroup>

または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>
于 2013-03-29T16:11:43.737 に答える