プロジェクト ファイルでは、ワイルドカードを使用して、すべてのファイルを 1 つのディレクトリまたは入れ子になった一連のディレクトリにビルドの入力として含めることができます。 ただし、ディレクトリ内に 1 つのファイルがある場合や、入れ子になった一連のディレクトリに、ビルドの入力として含めないディレクトリが 1 つ存在する場合があります。 入力の一覧からそのファイルまたはディレクトリを明示的に除外できます。 また、特定の条件下でのみ含めるファイルがプロジェクトに存在する場合もあります。 ファイルがビルドに含まれる条件を明示的に宣言できます。
注
この記事で説明する手法は、F# および C++ には適用できません。 これらのプロジェクト システムは、ソース ファイル自体を管理します。
Visual Studio を使用してファイルを除外する
Visual Studio を使用している場合は、ソリューション エクスプローラーでファイルを選択し、[プロパティ] ウィンドウを表示し (Alt キー+Enter キーを押して)、[ビルド アクション] を [なし] に設定します。
その結果、MSBuild プロジェクト ファイルで次の変更が行われます。
<ItemGroup>
<Compile Remove="ClassToExclude.cs" />
</ItemGroup>
<ItemGroup>
<None Include="ClassToExclude.cs" />
</ItemGroup>
これはいくつかのファイルに適していますが、特定のパターンに一致する多数のファイルやファイルにスケールアップすることはできません。 .NET プロジェクトでは、MSBuild を使用して、次に説明するようにワイルドカード式 ( glob とも呼ばれます) を使用してファイルとディレクトリを除外できます。
.NET プロジェクトのファイルまたはディレクトリを除外する
項目リストは、ビルドの入力ファイルです。 .NET SDK プロジェクトなどのほとんどのプロジェクトには、標準インポートによって既に定義されている、さまざまな種類の項目 (ソース ファイルの Compile
、特定の静的ファイルの Content
など) の定義済みの項目リストがあります。 これらの項目の一覧は、 一般的な MSBuild プロジェクト項目にあります。 プロジェクト コードでは、関連するものがすべて含まれるよう事前に定義されています。たとえば、C# プロジェクトの Compile
には、 .cs
拡張子を持つすべてのファイルが含まれます。
ファイルを除外するには、アイテムの Remove
属性を使用できます。
<ItemGroup>
<Compile Remove="ClassToExclude.cs" />
</ItemGroup>
複数の個別のファイルまたはさまざまな glob パターンを指定できます。
<ItemGroup>
<Compile Remove="Contoso*.cs" /> <!-- Wildcard on filename -->
<Compile Remove="File1.cs;File2.cs" /> <!-- List of files with separator -->
<Compile Remove="Contoso/**/*.cs" /> <!-- All .cs files in a directory subtree -->
</ItemGroup>
サポートされているパターンの一覧については、「 パターン形式」を参照してください。
MSBuild 言語でファイルまたはディレクトリを含める/除外する
生の MSBuild 言語 (つまり、標準のインポートや SDK への参照がない場合) では、含める項目は個別に宣言されるか、 Include
属性を使用してグループとして宣言されます。 例えば次が挙げられます。
<CSFile Include="Form1.cs"/>
<CSFile Include ="File1.cs;File2.cs"/>
<CSFile Include="*.cs"/>
<JPGFile Include="Images\**\*.jpg"/>
ワイルドカードを使用して、1 つのディレクトリ内のすべてのファイル、または入れ子になったディレクトリのセットをビルドの入力として含める場合は、ディレクトリ内に 1 つ以上のファイルがあるか、入れ子になったディレクトリのセットに 1 つのディレクトリが含まれていない可能性があります。 項目リストから項目を除外するには、 Exclude
属性を使用します。
Exclude
は実際には項目操作ではありません。単独では使用できませんが、 Include
の修飾子としてのみ使用できます。
.cs
を除くすべての .vb
または Form2
ファイルを含める
次のいずれかの
Include
属性とExclude
属性を使用します。<CSFile Include="*.cs" Exclude="Form2.cs"/>
又は
<VBFile Include="*.vb" Exclude="Form2.vb"/>
.cs
および.vb
を除く、すべてのForm2
またはForm3
ファイルを含めるには
次のいずれかの
Include
属性とExclude
属性を使用します。<CSFile Include="*.cs" Exclude="Form2.cs;Form3.cs"/>
又は
<VBFile Include="*.vb" Exclude="Form2.vb;Form3.vb"/>
.jpg
ディレクトリのサブディレクトリにImages
ファイルをすべて含めるには(Version2
ディレクトリ内のものを除く)
次の
Include
属性とExclude
属性を使用します。<JPGFile Include="Images\**\*.jpg" Exclude = "Images\**\Version2\*.jpg"/>
注
両方の属性のパスを指定する必要があります。 絶対パスを使用して
Include
属性でファイルの場所を指定する場合は、Exclude
属性の絶対パスも使用する必要があります。Include
属性で相対パスを使用する場合は、Exclude
属性の相対パスも使用する必要があります。
除外と削除
独自の項目リストを定義する場合は、可能な限り Exclude
を使用する必要があります。 除外される項目を処理する必要がないため、Exclude
と同じ宣言でInclude
を使用するとパフォーマンス上の利点があります。
Remove
は、Compile
やContent
などの標準項目リストの場合など、定義済みの項目リストがある場合に使用します。 その場合、 Exclude
はサポートされていません。
注
それをサポートする SDK を使用している場合は、$(OverrideDefaultCompileItems)
プロパティをtrue
に設定し、Compile
と必要に応じてInclude
を使用して独自のExclude
項目を定義できます。
条件を使用してビルドの入力からファイルまたはディレクトリを除外する
デバッグ ビルドに含める項目があり、リリース ビルドには含める必要がない場合は、 Condition
属性を使用して、項目を含める条件を指定できます。
リリース ビルドにのみファイル Formula.vb を含めるには
次のような
Condition
属性を使用します。<Compile Include="Formula.vb" Condition=" '$(Configuration)' == 'Release' " />
例
次のコード例では、Form2.csを除くディレクトリ内のすべての.cs ファイルを含むプロジェクトをビルドします。
<Project DefaultTargets="Compile"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
<PropertyGroup>
<builtdir>built</builtdir>
</PropertyGroup>
<ItemGroup>
<CSFile Include="*.cs" Exclude="Form2.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>