次の方法で共有


ビルドからファイルを除外する

プロジェクト ファイルでは、ワイルドカードを使用して、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"/>
    

Form2Form3 を除くすべての .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 を使用する必要があります。 除外される項目を処理する必要がないため、同じ宣言で ExcludeInclude と使用するとパフォーマンス上の利点があります。

CompileContent といった標準項目一覧の場合など、定義済みの項目一覧がある場合に 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>