ローカル ビルドをカスタマイズする

GitHub、ソース管理、または共有コードベースなどのコード リポジトリを使用しているチームで作業しているが、ローカル コンピューター上でビルドをカスタマイズしたい場合 (バグを再現したり、別の構成をテストしたりするために一時的に)、共有コード リポジトリと共有されている共有プロジェクト ファイルとそれらのカスタマイズを分離しておくと便利です。 この記事では、MSBuild で使用できるいくつかのビルド拡張機能について説明します。これにより、ユーザー固有またはローカル専用のカスタム構成を作成できます。

.user ファイル

$(MSBuildProjectFullPath).user (このコンテキストでは .user ファイルとも呼ばれます) を使うこともできます。 このファイルは、ローカル コンピューターに固有の拡張機能、オプション、または変数を保持することを目的としています。 ソース管理にアップロードされるものではなく、.gitignore 上で自動的に検査されます。 より広範な変更の場合は、将来の保守担当者がこの拡張メカニズムについて理解する必要がないように、プロジェクト自体を変更することをお勧めします。

サポートされているマルチターゲット プロジェクトでは、.user ファイルは内部ビルドと外部ビルドに自動的にインポートされるため、ソリューション内にファイルを作成できます。 別の種類のビルドで作業している場合でも、.user ファイルを使用できます。 ソリューション内で作成してから、プロジェクト ファイルにインポートすることができます。

<Import Project="$(MSBuildProjectFullPath).user" Condition="Exists('$(MSBuildProjectFullPath).user')"/>

MSBuildExtensionsPath と MSBuildUserExtensionsPath

慣例的に、多くのコア ビルド ロジック ファイルでは、

$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\{TargetFileName}\ImportBefore\*.targets

そのコンテンツの前、および

$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\{TargetFileName}\ImportAfter\*.targets

後にインポートします。 この規則により、インストールされた SDK で、共通プロジェクト タイプのビルド ロジックを拡張できます。

同じディレクトリ構造が $(MSBuildUserExtensionsPath) で検索されます。これはユーザー別フォルダー %LOCALAPPDATA%\Microsoft\MSBuild です。 そのフォルダーに置かれたファイルは、そのユーザーの資格情報の下で実行される、該当するプロジェクト タイプのすべてのビルドでインポートされます。 このユーザー拡張は、パターン ImportUserLocationsByWildcardBefore{ImportingFileNameWithNoDots} でインポート ファイルに基づいて名前が付けられたプロパティを設定することで無効にできます。 たとえば、ImportUserLocationsByWildcardBeforeMicrosoftCommonPropsfalse に設定すると、$(MSBuildUserExtensionsPath)\$(MSBuildToolsVersion)\Imports\Microsoft.Common.props\ImportBefore\* がインポートされません。

プロジェクト言語に基づくカスタム構成

.NET 言語 (C#、Visual Basic、または F#) に応じて異なる動作が必要な場合は、$(MSBuildProjectExtension) のプロジェクト ファイル拡張子に依存する条件を含むプロパティ グループを追加して、言語固有のプロパティとその値を定義できます。

<PropertyGroup Condition="'$(MSBuildProjectExtension)' == '.vbproj'">
   <!-- Put VB-only property definitions here -->
</PropertyGroup>
<PropertyGroup Condition="'$(MSBuildProjectExtension)' == '.fsproj'">
   <!-- Put F#-only property definitions here -->
</PropertyGroup>
<PropertyGroup Condition="'$(MSBuildProjectExtension)' == '.csproj'">
   <!-- Put C#-only property definitions here -->
</PropertyGroup>