9

プロジェクト ファイルでは StyleCop を使用しており、ビルド プロセス中に実行しています。次のように StyleCop ターゲットを含めるようにプロジェクト ファイルを変更しました。

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v9.0\WebApplications\Microsoft.WebApplication.targets" />
<Import Project="..\..\Tools\Microsoft\StyleCop\v4.3\Microsoft.StyleCop.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
     Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->

問題は、なぜこれが機能するのかということです。Microsoft.StyleCop.targets ファイルで定義されている StyleCop ターゲットを呼び出しているのは誰ですか?

私が知る限り、ビルドを開始したときに実行される唯一のターゲットは、「ビルド」ターゲットです。Microsoft.StyleCop.targets ファイル以外のどこにも、「StyleCop」ターゲットへの参照が見つかりません。繰り返しになりますが、なぜ呼び出されているのでしょうか。

私が知りたい理由は、独自のカスタム タスクで同様のことができれば素晴らしいからです。したがって、78 個の csproj ファイルすべてを編集する代わりに、次のような独自の一般的なターゲットをインポートすることができます。

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v9.0\WebApplications\Microsoft.WebApplication.targets" />
<Import Project="Common.targets" />

次に、そのファイルに StyleCop をインポートし、プロジェクトごとに実行する必要がある他のすべてのタスクをインポートします。

理解を助けてください。

4

1 に答える 1

9

ユーレカ!

秘密のソースは、StyleCop ターゲット ファイルの次の行です。

<PropertyGroup>
  <BuildDependsOn>$(BuildDependsOn);StyleCop</BuildDependsOn>
  <RebuildDependsOn>StyleCopForceFullAnalysis;$(RebuildDependsOn)</RebuildDependsOn>
</PropertyGroup>

Microsoft.Common.targets の "Build" ターゲットは次のように宣言されます。

<Target Name="Build"
        Condition=" '$(_InvalidConfigurationWarning)' != 'true' "
        DependsOnTargets="$(BuildDependsOn)"
        Outputs="$(TargetPath)" />

これは、「BuildDependsOn」プロパティにリストされているすべてのターゲットがビルド中に呼び出されることを意味します。いいじゃないですか。:)

于 2010-02-27T23:43:59.683 に答える