次の方法で共有


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

プロジェクト ファイルでは、ワイルドカードを使用して、すべてのファイルを 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は、CompileContentなどの標準項目リストの場合など、定義済みの項目リストがある場合に使用します。 その場合、 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>