ビルドからファイルを除外する
プロジェクト ファイルでは、ワイルドカードを使用して、1 つのディレクトリ内のすべてのファイル、または入れ子にされたディレクトリのセットをビルドの入力として使用することができます。 しかし、ディレクトリ内の 1 つのファイル、または入れ子にされたディレクトリのセット内の 1 つのディレクトリをビルドの入力に含めたくない場合もあります。 そのファイルまたはディレクトリは、入力の一覧から明示的に除外できます。 また、特定の条件のもとでのみ含めることを望むファイルがプロジェクトに存在することもあります。 ファイルをビルドに含める条件を明示的に宣言できます。
Note
この記事で説明する手法は、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
の修飾子としてのみ使用できます。
Form2
を除くすべての .cs
ファイルまたは *.vb
ファイルを含める場合
次の
Include
およびExclude
属性のうち、いずれかを使用します。<CSFile Include="*.cs" Exclude="Form2.cs"/>
または
<VBFile Include="*.vb" Exclude="Form2.vb"/>
Form2
と Form3
を除くすべての .cs
ファイルまたは .vb
ファイルを含める場合
次の
Include
およびExclude
属性のうち、いずれかを使用します。<CSFile Include="*.cs" Exclude="Form2.cs;Form3.cs"/>
または
<VBFile Include="*.vb" Exclude="Form2.vb;Form3.vb"/>
Version2
ディレクトリのファイルを除く Images
ディレクトリのサブディレクトリにあるすべての .jpg
ファイルを含める場合
次の
Include
属性とExclude
属性を使用します。<JPGFile Include="Images\**\*.jpg" Exclude = "Images\**\Version2\*.jpg"/>
注意
両方の属性にパスを指定する必要があります。 ファイルの場所を指定するのに
Include
属性で絶対パスを使用する場合、Exclude
属性においても絶対パスを使用する必要があります。Include
属性で相対パスを使用する場合は、Exclude
属性においても相対パスを使用する必要があります。
除外と削除
独自の項目一覧を定義する場合は、可能な限り Exclude
を使用する必要があります。 除外される項目を処理する必要がないため、同じ宣言で Exclude
を Include
と使用するとパフォーマンス上の利点があります。
Compile
や Content
といった標準項目一覧の場合など、定義済みの項目一覧がある場合に Remove
を使用します。 その場合、Exclude
はサポートされません。
Note
それをサポートする 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>