クラスライブラリテンプレートを使用してプロジェクトを作成すると、.csprojにMicrosoft.Common.propsのインポートが含まれていることに気付きました。
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
ただし、単体テストプロジェクトテンプレートを使用してプロジェクトを作成すると、プロジェクトが表示されません。
では、Microsoft.Common.propsは何をするのでしょうか?それはプロジェクトにどのように役立ちますか?
それは多くのことを行い、ビルドロジックの一部をもたらします。
実際、「標準」.NETプロジェクトには、Microsoft.Common.props
とMicrosoft.Common.targets
の2つの重要なインポートがあります(後者は、プロジェクトタイプ固有のインポートファイルから暗黙的に含まれる場合があります)。
基本的な考え方は、ビルドロジックを2つの部分に分割することです。1つはプロジェクトのコンテンツの前にインポートされ(.props
)、もう1つは後で含まれます(.targets
)。
Microsoft.Common.props
は、規則に基づいていくつかのプロパティを定義します。現在の構成のデフォルトを設定します(たとえば、コマンドラインからビルドするときに構成が指定されていない場合は、Debug
のビルド)。
また、msbuild/vsツールのインストールまたはプロジェクトの拡張機能としてインストールされている他のファイルもインポートします。 NuGet 4+は、これをPackageReference
スタイルのプロジェクトに使用します。
Microsoft.Common.props
インポートですべてのデフォルトが設定されたら、プロジェクトでは、ユーザーの選択(およびプロジェクトテンプレート)に応じてデフォルトを変更し、ビルドプロセスに必要なその他のプロパティとアイテムを定義します。
次に、プロジェクトは、プロジェクトのビルドを実行するために必要なmsbuildロジックを定義する.targets
ファイルをインポートする必要があります。これは、Microsoft.Common.targets
(およびインポートすることを選択したファイル)を介して行われます。このファイルからのロジックをオーバーライドする必要があるものはすべて、このインポート後に指定する必要があります。これが、VSのプロジェクトテンプレートにカスタムAfterBuild
ターゲット用のコメントアウト領域がある理由です。 AfterBuild
はすでに共通のターゲットを介して定義されているため、このインポート後にオーバーライドする必要があります(または、カスタム名を使用して、新しいMSBuildバージョンで推奨されるAfterTargets="AfterBuild"
を追加します)。
デフォルトとロジックの.props
/.targets
分割は、カスタムビルド拡張機能や、上部(.props
)と下部にインポートする必要があるmsbuildファイルの命名規則でもよく使用されます。 (.targets
)のプロジェクト。
.NET Coreに導入されたが、.NET Frameworkでも使用できる「SDKベース」プロジェクトでは、プロジェクトの前後にSdk.props
ファイルとSdk.targets
ファイルをインポートすることでこの概念が拡張されます。それぞれの内容。一連の規則は、これらのファイルの検索に役立ち、プロジェクトファイルの属性<Import>
を指定することで、<Project Sdk="Microsoft.NET.Sdk">...</Project>
要素を省略できるようにします。これらのインポートは、Microsoft.Common.props
よりもさらに多くのデフォルトを定義し、非常に小さく、より人間が読めるプロジェクトファイルを可能にします。 (現在、VS 2017は従来のcsprojファイルとは異なるプロジェクトシステムを使用しているため、.NET Core/.NETStandardおよびASP.NETCoreプロジェクトテンプレートのみがこの形式を使用します)