10

MSBuildで実行しようとしているビルドターゲットがあります。ターゲットには、中間ビルドの場合に時間を短縮するために配置したいくつかの入力と出力があります。入力ファイルは常に存在しますが(ヘッダーファイル)、出力は常に存在するとは限りません(XMLファイル)。

タスクをスキップする可能性のある中間ビルドは、パフォーマンスの点で非常にコストがかかるため、非常に望ましいものです。

とにかく、出力がすでに存在する場合、入力と出力はうまく機能します。その場合、MSBuildは、すべてのファイルが最新であるため、ターゲットがスキップされたことを示す非常に役立つメッセージを出力します。

出力ディレクトリとファイルが存在しない場合(このタスクを初めて実行する場合)、MSBuildは次のメッセージで失敗します。

出力がないため、ターゲット[targetname]をスキップします。

詳細な詳細度を追加すると、@(OutputXML)項目が空であることが理由であることがわかります。さて、今は何ですか?したがって、MSBuildの中間ビルドの概念全体が非常に堅牢であるとは思えません。

私の質問は、中間ビルドのメリットを享受し、出力がない場合でもこのターゲットを実行できるようにするにはどうすればよいですか?(私は自分のタスク拡張機能を書くことに頼る必要がないことを望んでいます)

これが私のビルドスクリプトの関連部分です:

<ItemGroup>
    <Headers  Include="..\**\*.h" />
    <OutputXML Include="$(OutputDir)\*.xml" />
</ItemGroup>

<Target Name="Doxygen" 
        Inputs="@(Headers)"
        Outputs="@(OutputXML)" >
    <Exec ... />
</Target>

注:私はグーグル、msdn、そしてこのウェブサイトのいたるところに答えを見つけようとしてきましたが、これまでのところ成功していません。私はMSBuild全般について非常に役立つ情報を見つけましたが。

4

1 に答える 1

8

ダミー出力を使用するのはどうですか?

<ItemGroup>
 <Headers  Include="..\**\*.h" />
 <OutputXML Include="$(OutputDir)\*.xml" />
</ItemGroup>

<ItemGroup Condition="'@(OutputXML)' == ''">
 <OutputXML Include="$(OutputDir)\dummy.xml" />
</ItemGroup>

<Target Name="Doxygen" 
        Inputs="@(Headers)"
        Outputs="@(OutputXML)" >
 <Exec ... />
</Target>

OutputDirをdummy.xmlに設定すると、ファイルが存在しなくても、それは空ではなくなります。ワイルドカードは、.xmlを検索していて見つからなかったことを示しますが、特定の1つに名前を付けると検索が行われないため、.xmlが存在するかどうかは関係ありません。

于 2013-03-18T08:56:10.030 に答える