ビルドするファイルを選択する

ほとんどのプロジェクトでは、ビルドするファイルを手動で選択する必要はありません。 たとえば、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 でこれを行うと、プロジェクト ファイルに影響します。 ソース ファイルを Compile 項目一覧から削除し、None 項目一覧に追加するための行が追加されたことがわかります。

  <ItemGroup>
    <Compile Remove="Class.cs" />
  </ItemGroup>

  <ItemGroup>
    <None Include="Class.cs" />
  </ItemGroup>

.NET Framework や SDK 以外のその他のプロジェクトの場合、すべてのソース ファイルをリストすると、プロジェクト ファイル内で Compile 項目が明示的に構築されます。

C++ プロジェクトの場合、ソース ファイルは、プロジェクト ファイル内の ClCompile 要素に明示的に追加されます。

MSBuild のプロジェクト ファイルを SDK を使用せずに手動で作成する場合は、各ソース ファイルを個別にプロジェクト ファイルにリストしたり、ワイルドカードを使用して、1 つのディレクトリまたは入れ子になったディレクトリ セット内のすべてのファイルを含めたりできます。 この記事の手法を使用すれば、.NET プロジェクトの Compile 項目一覧 や C++ プロジェクトの ClCompile 項目一覧を変更し、ビルドされるファイルをカスタマイズすることもできます。

入力を指定する

項目は、ビルドの入力 (ソース ファイルなど) を表します。 項目の詳細については、「MSBuild 項目」をご覧ください。

ビルドのファイルを含めるには、ファイルが項目一覧に含まれている必要があります。 これまで説明しましたように、.NET SDK と .NET Framework プロジェクトでは、ソース ファイルの項目一覧は Compile です。 暗黙的なインポートで定義されているため、.NET SDK プロジェクトに Compile 項目一覧は表示されません。 「SDK プロジェクトを使用する」を参照してください。

標準インポートに依存しないプロジェクト ファイルでは、VBFile または CSFile など、任意の項目一覧名を使用できます。 例については、この記事の後半にある 「例 1」と「例 2」を参照してください。 項目一覧に基づいてビルドを設定するには、この記事の後半で説明するように、項目一覧を名前でビルド タスクに渡します。

複数のファイルを項目リストに追加するには、ファイルを個別に含めるか、ワイルドカードを使用して一度に複数のファイルを含めます。

項目を個別に宣言するには

  • 次のような Include 属性を使用します。

    <Compile Include="Form1.cs"/>

    or

    <Compile Include="Form1.vb"/>

    Note

    項目コレクション内の項目がプロジェクト ファイルと同じディレクトリにない場合は、その項目への完全パスまたは相対パスを指定する必要があります。 (例: Include="..\..\Form2.cs")。

同じ項目一覧は、複数の Include 属性で繰り返し変更できます。 それぞれの Include は、以前からあった属性に追加されます。

複数の項目を宣言するには

  • 次のような Include 属性を使用します。

    <Compile Include="Form1.cs;Form2.cs"/>

    or

    <Compile Include="Form1.vb;Form2.vb"/>

ワイルドカードを使用して入力を指定する

ワイルドカードを使用して、すべてのファイルまたはサブディレクトリから特定のファイルのみを再帰的に含めることができます。 ワイルドカードの詳細については、「MSBuild 項目」をご覧ください。

次の例は、次のディレクトリとサブディレクトリ内のグラフィック ファイルを含むプロジェクトに基づいており、プロジェクト ファイルは Project ディレクトリに配置されています。

Project\Images\BestJpgs

Project\Images\ImgJpgs

Project\Images\ImgJpgs\Img1

Images ディレクトリとサブディレクトリ内のすべての .jpg ファイルを含めるには

  • 次の Include 属性を使用します。

    Include="Images\**\*.jpg"

img で始まるすべての .jpg ファイルを含めるには

  • 次の Include 属性を使用します。

    Include="Images\**\img*.jpg"

ディレクトリ内の jpg で終わる名前を持つすべてのファイルを含めるには

  • 次のいずれかの Include 属性を使用します。

    Include="Images\**\*jpgs\*.*"

    または

    Include="Images\**\*jpgs\*"

項目の除外と削除

一部の例外を除き、特定のパターンに一致するファイルを指定できます。 これは、IncludeExclude を組み合わせた 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>

    or

    <VBC Sources="@(VBFile)">...</VBC>

Note

ワイルドカードと項目を使用して、ビルドの入力を指定する必要があります。MSBuild タスクの Sources 属性 (CscVbc など) を使用して入力を指定することはできません。 次の例はプロジェクト ファイルでは無効です。

<CSC Sources="*.cs">...</CSC>

例 1

次のコード例では、すべての入力ファイルを個別に含むプロジェクトを示します。

<Project DefaultTargets="Compile"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
    <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"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >

    <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>