ソリューション ビルドをカスタマイズする

MSBuild でソリューション ファイルがビルドされるとき、最初に内部でプロジェクト ファイルに変換され、それからビルドされます。 生成されたプロジェクト ファイルは、ターゲットを定義する前に before.{solutionname}.sln.targets をインポートし、ターゲットをインポートした後に after.{solutionname}.sln.targets をインポートします。ターゲットには、$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportBefore ディレクトリと $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportAfter ディレクトリにインストールされたターゲットが含まれます。

たとえば、次のコードを含む after.MyCustomizedSolution.sln.targets という名前の同じディレクトリにファイルを作成することで、MyCustomizedSolution.sln のビルド後にカスタム ログ メッセージを書き込む新しいターゲットを定義できます。

<Project>
 <Target Name="EmitCustomMessage" AfterTargets="Build">
   <Message Importance="High" Text="The solution has completed the Build target" />
 </Target>
</Project>

ソリューション ビルドはプロジェクト ビルドとは別個のものなので、ここでの設定はプロジェクト ビルドには影響しません。

重要

この方法によるソリューション ビルドのカスタマイズは、MSBuild.exe を持つコマンドライン ビルドにのみ適用されます。 Visual Studio 内のビルドには適用されません。 このため、カスタマイズをソリューション レベルで行うことはお勧めしません。 ソリューション内のすべてのプロジェクトをカスタマイズする場合に推奨される代替手段は、この記事の他の部分で説明されているように、ソリューション フォルダー内の Directory.Build.props および Directory.build.targets ファイルを使用することです。

同じ方法で拡張したいソリューション ファイルが多数あるものの、$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ フォルダーには書き込みたくない場合 (通常、高度な権限が必要)、Directory.Solution.propsDirectory.Solution.targets というファイルを作成して、拡張するソリューション ファイルの上のルート パスに配置します。 Directory.Solution.props はソリューション ビルド開始時にインポートされ、Directory.Solution.targets はソリューション ビルド終了時にインポートされます。 ソリューション ファイルをビルドする場合、Directory.Build.propsDirectory.Build.targets はインポートされないため、代わりに Directory.Solution.propsDirectory.Solution.targets を使用する必要があります。 暗黙的な相互インポートが行われることはありません。

ルート フォルダーに Directory.Solution.props または Directory.Solution.targets があるものの、インポート先として指定したくないソリューションがそのフォルダーにある場合は、前に説明したソリューション固有のファイル before.{solutionname}.sln.targetsafter.{solutionname}.sln.targets を使用すると、プロパティ $(ImportDirectorySolutionProps)$(ImportDirectorySolutionTargets) を false に設定できます。 または、プロパティ $(DirectorySolutionPropsPath)$(DirectorySolutionTargetsPath) を使用すると、それらのファイルに別の場所を指定することもできます。 これは、サブセットに共通する特定のプロパティ値やターゲットを必要とするソリューションのサブセットが多様に存在する場合に役立ちます。