Import 要素 (MSBuild)
1 つのプロジェクト ファイルの内容を別のプロジェクト ファイルにインポートします。
<Project><Import>
構文
<Import Project="ProjectPath"
Condition="'String A'=='String B'" />
属性と要素
以降のセクションでは、属性、子要素、および親要素について説明します。
属性
属性 | 説明 |
---|---|
Project |
必須の属性です。 インポートするプロジェクト ファイルのパス。 パスにはワイルドカードを含めることができます。 一致するファイルは、並べ替えられた順にインポートされます。 この機能を使用すると、コード ファイルをディレクトリに追加するだけで、プロジェクトにコードを追加できます。 |
Condition |
省略可能な属性です。 評価する条件です。 詳細については、「条件」を参照してください。 |
Label |
省略可能な属性です。 このインポート要素に識別子を適用します。 |
Sdk |
省略可能な属性です。 プロジェクト SDK を参照します。 |
子要素
なし
親要素
要素 | 説明 |
---|---|
プロジェクト | MSBuild プロジェクト ファイルの必須のルート要素です。 |
ImportGroup | オプションの条件下でグループ化された Import 要素のコレクションが格納されます。 |
解説
Import
要素を使用すると、複数のプロジェクト ファイルに共通するコードを再利用できます。 インポートを使うと、共有されたコードに対する更新が、そのコードをインポートしたすべてのプロジェクトに反映されるため、コードの保守が容易になります。
慣例により、インポートされた共有プロジェクト ファイルは .targets
ファイルとして保存されますが、これらは標準の MSBuild プロジェクト ファイルです。 MSBuild では、別のファイル名拡張子を持つプロジェクトをインポートできませんが、一貫性を保つため、 .targets
拡張子を使用することをお勧めします。
インポートされるプロジェクト内の相対パスは、インポートする側のプロジェクトのディレクトリからの相対パスであると解釈されます (いくつかの例外についてはこの段落の後半で説明します)。 したがって、あるプロジェクト ファイルを別々の場所に存在する複数のプロジェクト ファイルにインポートする場合、インポートされるプロジェクト ファイル内の相対パスは、インポートされるプロジェクトごとに異なって解釈されます。 ただし、例外が 2 つあります。 1 つは、Import
要素では、パスは常に、Import
要素が含まれるプロジェクトの相対パスとして解釈されることです。 もう 1 つの例外は、UsingTask
では常に、AssemblyFile
属性の相対パスは UsingTask
要素が含まれるファイルに相対であるとして解釈されることです。
MSBuild で予約されている、プロジェクト ファイル関連の全プロパティ (例: MSBuildProjectDirectory
、MSBuildProjectFile
) は、インポートされたプロジェクトで参照される場合、インポートするプロジェクト ファイルに基づいて値が割り当てられます。
インポートされるプロジェクトに DefaultTargets
属性がない場合は、インポートされる各プロジェクトがインポート順にチェックされ、最初に検出された DefaultTargets
属性の値が使用されます。 たとえば、ProjectA で ProjectB と ProjectC を (この順序で) インポートし、ProjectB で ProjectD をインポートする場合、MSBuild では、ProjectA、ProjectB、ProjectD、ProjectC の順序で指定された DefaultTargets
が検索されます。
インポートされるプロジェクトのスキーマは、標準プロジェクトのスキーマと同じです。 MSBuild では、インポートされたプロジェクトをビルドできる場合もありますが、インポートされたプロジェクトには、設定するプロパティやターゲットを実行する順序に関する情報が通常は含まれていないため、ビルドできる可能性は低くなります。 インポートされるプロジェクトのこれらの情報は、インポートするプロジェクトに依存します。
ワイルドカード
.NET Framework 4 では、MSBuild で、Project 属性でのワイルドカードが許可されます。 ワイルドカードがある場合、見つかったすべての一致が並べ替えられ (再現可能性の確保のため)、順序が明示的に設定されていたかのように、その順序でインポートされます。
これは、機能拡張ポイントを提供して、自身がファイル名をインポート対象のファイルに明示的に追加しなくても、他のユーザーがファイルをインポートできるようにする場合に便利です。 このために、Microsoft.Common.Targets ではファイルの先頭に次の行が含まれています。
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\$(MSBuildThisFile)\ImportBefore\*" Condition="'$(ImportByWildcardBeforeMicrosoftCommonTargets)' == 'true' and exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\$(MSBuildThisFile)\ImportBefore')"/>
例
次の例は、いくつかの項目やプロパティがあり、一般的なプロジェクト ファイルをインポートするプロジェクトを示しています。
<Project DefaultTargets="Compile"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<resourcefile>Strings.resx</resourcefile>
<compiledresources>
$(O)\$(MSBuildProjectName).Strings.resources
</compiledresources>
</PropertyGroup>
<ItemGroup>
<CSFile Include="*.cs" />
<Reference Include="System" />
<Reference Include="System.Data" />
</ItemGroup>
<Import Project="$(CommonLocation)\General.targets" />
</Project>