5

これが、ccnet+tfs+msbuild です。

問題は、プロジェクトが多いためにビルド プロセスが遅すぎることです。

私はいくつかの調査を行い、それが私がやりたいことです。

各プロジェクトがコンパイルされた後、出力フォルダーから共有フォルダーにコピーされます。この操作は、このプロジェクトがコンパイルされていない場合でも実行されます。だから私は msbuild の詳細なログをチェックしました。

この検証アクションは、Microsoft.TeamFoundation.Build.targets で宣言されています。問題は、この情報を傍受し、独自のターゲットを作成して条件を追加し、何らかのトリガーを実行する方法です。コンパイルされた後、このコピー ターゲットが実行されます。

4

1 に答える 1

6

http://sedodream.com/2012/05/14/MSBuildHowToExecuteATargetAfterCoreCompile.aspxでこれをブログに書きましたが、以下にコンテンツを貼り付けました。

私は今日 StackOverflow を使用していて、次の行に沿った質問に気付きました。 CoreCompile がスキップされるときは?」以下は私の答えです。

これは一般的なケースでは解決が難しい問題ですが、CoreCompile にはこのシナリオに対する特別なサポートが組み込まれているため、このケースでは非常に簡単です。CoreCompile を使用してこれを実現する方法の詳細に入る前に、それが一般的にどのように機能するかを説明しましょう。

一般的なケースの説明

MSBuild では、インクリメンタル ビルドが原因でターゲットがスキップされます。インクリメンタル ビルドは、ターゲット自体の入力および出力属性から純粋に駆動されます。入力はターゲットが「使用」するファイルのリストであり、出力はターゲットによって「生成」されるファイルのリストです。引用符を使用しているのは、具体的な概念ではなく大まかな概念であるためです。簡単にするために、入力/出力をファイルのリストとして扱うことができます。ターゲットが実行されようとしているとき、MSBuild は入力を受け取り、それらのタイムスタンプを出力と比較します。すべての出力が入力より新しい場合、ターゲットはスキップされます。(参考までに、一部の出力のみが古くなっている場合に何が起こるかを知りたい場合は、http://sedodream.com/2010/09/23/MSBuildYouveHeardOfIncrementalBuildingButHaveYouHeardOfPartialBuilding にある私のブログをお読みください。

いずれにせよ、ターゲットをスキップしたい場合は、入力/出力を正しく作成する必要があります。あなたの場合、CoreCompile がスキップされるたびにターゲットをスキップしたいので、表面的には CoreCompile の入力/出力を単純にコピーできるように見えますが、それは機能しません。CoreCompile が実行されたときにファイルが古くなっている可能性がありますが、そのターゲット自体がファイルを最新の状態にするため、機能しません。次に、ターゲットが実行されると、それらはすべて最新であるためスキップされます。入力/出力をコピーし、ターゲットが作成する入力/出力に追加のファイルを追加する必要があります。これにより、最初のパスでターゲットがスキップされなくなります。

CoreCompile の特定のソリューション

プロジェクト ファイルを見ると、下部に Microsoft.Common.targets ファイルがインポートされていることがわかります。このファイルは、言語固有の .targets ファイルをインポートします。たとえば、Microsoft.CSharp.targets または Microsoft.VisualBasic.targets のいずれかをインポートします (C# または VB を使用している場合)。これらの .targets ファイルには、CoreCompile が定義されています。CoreCompile の定義では、最後に次のように表示されます。

<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/>

これにより、プロパティで定義されたすべてのターゲットが呼び出されTargetsTriggeredByCompilationます。したがって、CoreCompile が実行されるたびにターゲットが呼び出されるようにする場合は、そのプロパティを拡張できます。これを行う方法は次のとおりです。

<PropertyGroup>
  <TargetsTriggeredByCompilation>
    $(TargetsTriggeredByCompilation);
    MyCustomTarget
  </TargetsTriggeredByCompilation>
</PropertyGroup>

<Target Name="MyCustomTarget">
  <Message Text="MyCustomTarget called" Importance ="high"/>
</Target>

この場合、プロパティTargetsTriggeredByCompilationを定義し、それに MyCustomTargetを追加します。$(TargetsTriggeredByCompilation);を含めることが非常に重要です。そうしないと、追加ではなく上書きされます。したがって、他の誰かがこの手法を使用した場合、そのターゲットを一掃します。

以下は、一度ビルドして CoreCompile と MyCustomTarget を実行した場所を示す画像です。次に、2 番目のビルド CoreCompile がスキップされ、MyCustomTarget が呼び出されることはありません。

ここに画像の説明を入力

于 2012-05-14T03:03:42.470 に答える