2011-05-27 13 views
5

私が取り組んでいる(VS2008からVS2010に変換した)C++プロジェクトは、いくつかのvcbuild .rulesファイルを使用してカスタムビルドルールを指定していました。これらの.rulesファイルには、ターゲットの再構築が必要な場合に作業する際に考慮する必要があるファイルのリストを指定したCustomBuildRuleノードの特定の "AdditionalDependencies"プロパティがあります。これらの "AdditionalDependencies"は、VS2010変換中に対応する.propsファイルに忠実に引き継がれました。カスタムMSBuildターゲットの実行をファイルのタイムスタンプに依存させるにはどうすればよいですか?

カスタムビルドルールに関連付けられた.targetsファイルは、AdditionalDependenciesTargetノードのInputsプロパティに追加します。これにより、依存関係にリストされているファイルのいずれかが存在しない場合でもターゲットが実行されますが、依存関係の1つがターゲットの出力よりも新しい場合、ターゲットは実行されません。すべてのファイルが実際に入力されているわけではなく、ターゲットのビルド中に使用される可能性のある実行可能ファイルを参照するものもあります。そのため、バージョンコントロールにチェックインされ、存在する可能性がありますが、ファイルの新しいバージョンでは、影響を受けるターゲットの再構築をトリガする必要があります。

ノードにはConditionプロパティが表示されますが、このプロパティでサポートされている条件は既に実行されている「存在」テストを過ぎても表示されません。

2つのファイルのタイムスタンプ(または、理想的には、AdditionalDependenciesにリストされているファイルのタイムスタンプをターゲットの出力ファイルと比較する)を使用できる条件があるので、make-like "これらの依存関係が古くなった場合、このターゲットを再構築する"

答えて

2

ターゲットOutputプロパティに詳しく見てください:「MSBuildのは、出力ファイルのタイムスタンプで入力ファイルのタイムスタンプを比較し、スキップするかどうかを確認、構築、または部分的にターゲットを再構築することができます

を。@で任意のファイル(CSFile)アイテムリストがファイルhello.exeファイルよりも新しい場合、次の例では、MSBuildのは、ターゲットを実行します。そうでない場合はスキップされます:」

<Target Name="Build" 
    Inputs="@(CSFile)" 
    Outputs="hello.exe"> 

    <Csc 
     Sources="@(CSFile)" 
     OutputAssembly="hello.exe"/> 
</Target> 

元の記事MSBuildを使用したインクリメンタルビルドの詳細hereを見つけることができます。

+0

はい、ターゲットの入力と出力のプロパティを認識しています。問題は、Inputsプロパティに 'generator'実行可能ファイルの名前が含まれていて、タイムスタンプが変更されたとしても、出力が必ずしも再生成されないことです。 –

+1

おそらく入力プロパティの "ジェネレータ実行可能ファイルの名前"がファイルへのパスを表していないため、MSBuildは変更されたタイムスタンプを検出できません。 – KimCM

関連する問題