2

カスタムターゲットを開発しました。これは、コンパイル(csc)が行われた場合にのみ実行する必要があります(それ以外の場合は、ビルドプロセスに時間がかかりすぎます)。コレクションに新しいファイルがある場合InputsOutputs属性を使用してファイルのタイムスタンプを比較し、ターゲットを実行できることがわかりました。Inputs問題は、ターゲットがファイルを生成しないことです。そのため、Outputsこの機能を正しく取得するために属性として何を渡す必要があるかわかりません(コンパイルが実行されるときに、ターゲットアセンブリを使用してチェックすることはできません。これは、アセンブリは実際の時間であるため、ターゲットは実行されません)。

どうすればこれを達成できますか?

4

2 に答える 2

1

ダミーファイルを書き出して、それを出力に使用できます。ターゲット内でWriteLinesToFileタスクを使用して、「MyTarget.output」のようなファイルを出力します。

MsBuildは、そのファイルのタイムスタンプを使用して、ターゲットが最後に実行された日時を追跡し、入力ファイルが出力ファイルよりも新しいかどうかを判断して、ターゲットを再度実行することを認識します。

于 2012-04-05T08:37:46.497 に答える
0

考えられる解決策の1つは、を使用することPostBuildEventです。これを機能させるには、次のことを行う必要があります。

  1. 値をに設定します<PostBuildEvent><PropertyGroup>これは、たとえば次のように、内で直接実行できます<PostBuildEvent>echo Post build event completed</PostBuildEvent>。空にすることはできないので、私echoは出力にメッセージを書き込むためだけに使用しました。<PostBuildEvent>
  2. プロパティ<PostBuildEvent>をに設定しますOnOutputUpdated。これにより、MSBuildはコンパイルの前後のアセンブリタイムスタンプを比較し<PostBuildEvent>、アセンブリが変更された場合にのみ実行されます。
  3. 実行する依存関係/ターゲットを設定します<PostBuildEventDependsOn>

完全な例は次のようになります。

<PropertyGroup>
    <PostBuildEvent>echo Post build event completed</PostBuildEvent>
    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
    <PostBuildEventDependsOn>$(PostBuildEventDependsOn);MyCustomTarget</PostBuildEventDependsOn>
</PropertyGroup>
于 2012-04-05T08:32:06.100 に答える