GitHub、ソース管理、または共有コードベースなどのコード リポジトリで共有コードを操作する場合は、MSBuild を使用してローカル コンピューター上のビルドを一時的にカスタマイズできます。 バグを一時的に再現したり、別の構成をテストしたりして、それらのカスタマイズを共有コード リポジトリ内のファイルとは別にしておく必要がある場合があります。 この記事では、MSBuild で使用できるいくつかのビルド拡張機能について説明します。これにより、ユーザー固有またはローカル専用のカスタム ビルド構成を作成できます。
[前提条件]
- MSBuild を使用してビルドする Visual Studio プロジェクト。
ユーザー ファイルを使用する
$(MSBuildProjectFullPath).user
(このコンテキストではユーザー ファイルとも呼ばれます) を使用して、ローカル コンピューターに固有の拡張機能、オプション、または変数を格納できます。 ユーザー ファイルはソース管理にアップロードされるものではなく、 .gitignore
で自動的にチェックされます。 より広範な変更を行うには、プロジェクト自体を変更します。そのため、将来の保守担当者はこの拡張メカニズムについて知る必要はありません。
サポートされているマルチターゲット プロジェクトでは、ユーザー ファイルは内部ビルドと外部ビルドに自動的にインポートされるため、ソリューション内にこのファイルを作成できます。 別の種類のビルドで作業している場合は、ソリューション内でユーザー ファイルを作成し、プロジェクト ファイルにインポートすることで、次のようにユーザー ファイルを使用できます。
<Import Project="$(MSBuildProjectFullPath).user" Condition="Exists('$(MSBuildProjectFullPath).user')"/>
MSBuildExtensionsPath と MSBuildUserExtensionsPath を使用する
規則により、多くのコア ビルド ロジック ファイルは、 $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\TargetFileName\ImportBefore\*.targets
ファイルを内容の前にインポートし、その後に $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\TargetFileName\ImportAfter\*.targets
ファイルをインポートします。 この規則により、インストールされている SDK は、一般的なプロジェクトの種類のビルド ロジックを拡張できます。
$(MSBuildUserExtensionsPath)
で同じディレクトリ構造が検索されます。これは、\Microsoft\MSBuild%LOCALAPPDATA% ユーザー単位のフォルダーです。 そのフォルダーに配置されたファイルは、そのユーザーの資格情報の下で実行される、対応するプロジェクトの種類のすべてのビルドに対してインポートされます。
ユーザー拡張機能を無効にするには、パターン ImportUserLocationsByWildcardBefore\<ImportingFileNameWithNoDots>
で、インポート ファイルにちなんだ名前のプロパティを設定します。 たとえば、 ImportUserLocationsByWildcardBeforeMicrosoftCommonProps
を false
に設定すると、 $(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>