ほとんどのプロジェクトでは、ビルドするファイルを具体的に選択する必要はありません。 たとえば、Visual Studio で作成されたプロジェクトは、プロジェクト内のすべてのソース ファイルをビルドします。 ただし、プロジェクト フォルダーの外部の他の場所からファイルをビルドする場合や、.NET SDK などの SDK を使用する代わりに独自のビルド プロセスを作成する場合など、既定とは異なるシナリオを処理するために、プロジェクト ファイルを編集する方法を知る必要がある場合があります。
プロジェクトの種類別の既定の動作
MSBuild がビルドに含めるファイルを決定する既定の動作は、プロジェクトの種類によって異なります。
.NET SDK プロジェクトの場合、標準の .NET SDK は、適切な言語固有のファイル拡張子と一致するプロジェクト フォルダー ツリー内のファイルを含む既定の Compile 項目リストを定義します。 たとえば、C# プロジェクトの場合、 Compile 項目には glob パターン **/*.csが設定されます。このパターンは、プロジェクト フォルダー内のすべてのソース ファイルとそのサブフォルダーに再帰的に一致します。 プロジェクト ファイルに Compile 要素が表示されないのは、暗黙的にインポートされる SDK .props ファイルで定義されているためです。
.NET プロジェクト SDK の概要 - 既定のインクルードと除外を参照してください。
Visual Studio を使用している場合は、ファイルのビルド アクション を変更することで、ビルドするソース ファイルのセットを変更できます。
Noneに設定して、ビルドからファイルを除外します。 Visual Studio でこの変更を行った場合、プロジェクト ファイルに影響します。 Visual Studio では、 Compile 項目リストからソース ファイルを削除する行が追加され、 None 項目一覧に追加されます。
<ItemGroup>
<Compile Remove="Class.cs" />
</ItemGroup>
<ItemGroup>
<None Include="Class.cs" />
</ItemGroup>
.NET Framework またはその他の SDK 以外のプロジェクトの場合、 Compile 項目は、すべてのソース ファイルを一覧表示することによって、プロジェクト ファイル内で明示的に構築されます。
C++ プロジェクトの場合、ソース ファイルはプロジェクト ファイル内の ClCompile 要素に明示的に追加されます。
SDK を使用せずに MSBuild プロジェクト ファイルを手動で作成する場合は、プロジェクト ファイル内の各ソース ファイルを個別に一覧表示するか、ワイルドカードを使用して、すべてのファイルを 1 つのディレクトリまたは入れ子になった一連のディレクトリに含めることができます。 また、この記事の手法を使用して、 Compile 項目リスト (.NET プロジェクト) または C++ プロジェクトの ClCompile 項目リストを変更して、ビルドするファイルをカスタマイズすることもできます。
入力を指定する
項目は、ビルドの入力 (ソース ファイルなど) を表します。 項目の詳細については、「 項目」を参照してください。
ビルドのファイルを含めるには、項目リストに含める必要があります。 前に説明したように、.NET SDK および .NET Framework プロジェクトでは、ソース ファイルの項目一覧が Compile。 暗黙的なインポートで定義されているため、.NET SDK プロジェクトに Compile 項目の一覧は表示されません。 「 プロジェクト SDK の使用」を参照してください。
標準インポートに依存しないプロジェクト ファイルでは、 VBFile や CSFileなどの任意の項目リスト名を使用できます。 この記事の 後の例 1 と 例 2 を参照してください。 項目リストに基づいてビルドを設定するには、 この記事で後述するように、名前で項目リストをビルド タスクに渡します。
複数のファイルを項目リストに追加するには、ファイルを個別に含めるか、ワイルドカードを使用して一度に多数のファイルを含めることができます。
項目を個別に宣言するには
次のような
Include属性を使用します。<Compile Include="Form1.cs"/>又は
<Compile Include="Form1.vb"/>注
項目コレクション内の項目がプロジェクト ファイルと同じディレクトリにない場合は、アイテムの完全パスまたは相対パスを指定する必要があります。 たとえば、
Include="..\..\Form2.cs"と指定します。
同じ項目リストは、複数の Include 属性によって繰り返し変更できます。 各 Include は、以前にあったものに追加されます。
複数の項目を宣言するには
次のような
Include属性を使用します。<Compile Include="Form1.cs;Form2.cs"/>又は
<Compile Include="Form1.vb;Form2.vb"/>
ワイルドカードを使用して入力を指定する
ワイルドカードを使用して、すべてのファイルまたはサブディレクトリの特定のファイルのみをビルドの入力として再帰的に含めることもできます。 ワイルドカードの詳細については、「項目」を参照してください。
次の例は、次のディレクトリとサブディレクトリにグラフィックス ファイルを含むプロジェクトに基づいており、プロジェクト ファイルは Project ディレクトリにあります。
Project\Images\BestJpgs
Project\Images\ImgJpgs
Project\Images\ImgJpgs\Img1
Images ディレクトリとサブディレクトリにすべての .jpg ファイルを含めるには
次の
Include属性を使用します。Include="Images\**\*.jpg"
img 以降のすべての .jpg ファイルを含めるには
次の
Include属性を使用します。Include="Images\**\img*.jpg"
名前が jpgs で終わるディレクトリにすべてのファイルを含めるには
次のいずれかの
Include属性を使用します。Include="Images\**\*jpgs\*.*"又は
Include="Images\**\*jpgs\*"
アイテムの除外と削除
一部の例外を除き、特定のパターンに一致するファイルを指定できます。 これは、 Include と Excludeの組み合わせで 1 回の操作で実行できます。
<ItemGroup>
<!-- Include every C# source file, except anything in the "sub" folder -->
<Compile Include="**/*.cs" Exclude="sub/**/*.cs">
</ItemGroup>
以前に含まれていた項目、または SDK によって既定で含まれていた項目を削除するには、 Remove 属性を使用できます。
<ItemGroup>
<!-- Remove anything in the "sub" folder -->
<Compile Remove="sub/**/*.cs">
</ItemGroup>
タスクまたはターゲットに項目を渡す
ほとんどのプロジェクト ファイルでは、 Compile 項目をターゲットまたはタスクに明示的に渡す必要はありません。これは標準のインポートによって処理されるためです。 ただし、プロジェクト ファイルのターゲットの場合は、タスクの @() 表記を使用して、ビルドの入力として項目リスト全体を指定できます。 この表記は、すべてのファイルを個別に一覧表示するか、ワイルドカードを使用するかに関係なく使用できます。
コンパイラ タスクへの入力としてすべての C# ファイルまたは Visual Basic ファイルを使用するには
次のような
Include属性を使用します。<CSC Sources="@(CSFile)">...</CSC>又は
<VBC Sources="@(VBFile)">...</VBC>
注
ビルドの入力を指定するには、項目と共にワイルドカードを使用する必要があります。Sources や Vbc などの MSBuild タスクで属性を使用して入力を指定することはできません。 次の例は、プロジェクト ファイルでは有効ではありません。
<CSC Sources="*.cs">...</CSC>
例 1
次のコード例は、すべての入力ファイルを個別に含むプロジェクトを示しています。
<Project DefaultTargets="Compile">
<PropertyGroup>
<Builtdir>built</Builtdir>
</PropertyGroup>
<ItemGroup>
<CSFile Include="Form1.cs"/>
<CSFile Include="AssemblyInfo.cs"/>
<Reference Include="System.dll"/>
<Reference Include="System.Data.dll"/>
<Reference Include="System.Drawing.dll"/>
<Reference Include="System.Windows.Forms.dll"/>
<Reference Include="System.XML.dll"/>
</ItemGroup>
<Target Name="PreBuild">
<Exec Command="if not exist $(builtdir) md $(builtdir)"/>
</Target>
<Target Name="Compile" DependsOnTargets="PreBuild">
<Csc Sources="@(CSFile)"
References="@(Reference)"
OutputAssembly="$(builtdir)\$(MSBuildProjectName).exe"
TargetType="exe" />
</Target>
</Project>
例 2
次のコード例では、ワイルドカードを使用して、すべての .cs ファイルを含めます。
<Project DefaultTargets="Compile">
<PropertyGroup>
<builtdir>built</builtdir>
</PropertyGroup>
<ItemGroup>
<CSFile Include="*.cs"/>
<Reference Include="System.dll"/>
<Reference Include="System.Data.dll"/>
<Reference Include="System.Drawing.dll"/>
<Reference Include="System.Windows.Forms.dll"/>
<Reference Include="System.XML.dll"/>
</ItemGroup>
<Target Name="PreBuild">
<Exec Command="if not exist $(builtdir) md $(builtdir)"/>
</Target>
<Target Name="Compile" DependsOnTargets="PreBuild">
<Csc Sources="@(CSFile)"
References="@(Reference)"
OutputAssembly="$(builtdir)\$(MSBuildProjectName).exe"
TargetType="exe" />
</Target>
</Project>