方法 : インクリメンタル ビルドを実行するHow to: Build Incrementally

大規模なプロジェクトをビルドする場合、今でも最新の以前にビルドされたコンポーネントが再ビルドされないことが重要です。When you build a large project, it is important that previously built components that are still up-to-date are not rebuilt. すべてのターゲットが毎回ビルドされると、各ビルドが完了するのに長い時間がかかります。If all targets are built every time, each build will take a long time to complete. インクリメンタル ビルド (ビルド内の以前にビルドされていないターゲット、または古くなっているターゲットだけが再ビルドされます) を有効にするため、Microsoft Build EngineMicrosoft Build Engine (MSBuildMSBuild) は入力ファイルのタイムスタンプと出力ファイルのタイムスタンプを比較して、ターゲットをスキップ、ビルド、または部分的に再ビルドするかどうかを判断できます。To enable incremental builds (builds in which only those targets that have not been built before or targets that are out of date, are rebuilt), the Microsoft Build EngineMicrosoft Build Engine (MSBuildMSBuild) can compare the timestamps of the input files with the timestamps of the output files and determine whether to skip, build, or partially rebuild a target. ただし、入力と出力の間に一対一のマッピングが必要です。However, there must be a one-to-one mapping between inputs and outputs. 変換を使用して、ターゲットがこの直接マッピングを識別できるようにすることができます。You can use transforms to enable targets to identify this direct mapping. 変換の詳細については、「MSBuild 変換」を参照してください。For more information on transforms, see Transforms.

入力と出力を指定するSpecifying Inputs and Outputs

入力と出力がプロジェクト ファイルで指定されている場合は、ターゲットはインクリメンタル方式でビルドできます。A target can be built incrementally if the inputs and outputs are specified in the project file.

ターゲットに入力と出力を指定するにはTo specify inputs and outputs for a target

  • Target 要素の Inputs 属性と Outputs 属性を使用します。Use the Inputs and Outputs attributes of the Target element. 例:For example:

    <Target Name="Build"  
        Inputs="@(CSFile)"  
        Outputs="hello.exe">  
    

    MSBuildMSBuild は入力ファイルのタイムスタンプと出力ファイルのタイムスタンプを比較し、ターゲットをスキップ、ビルド、または部分的に再ビルドするかどうかを判断できます。 can compare the timestamps of the input files with the timestamps of the output files and determine whether to skip, build, or partially rebuild a target. 次の例では、@(CSFile) 項目リスト内の任意のファイルが hello.exe ファイルより新しい場合、MSBuildMSBuild はターゲットを実行します。そうでない場合は、ターゲットがスキップされます。In the following example, if any file in the @(CSFile) item list is newer than the hello.exe file, MSBuildMSBuild will run the target; otherwise it will be skipped:

<Target Name="Build"   
    Inputs="@(CSFile)"   
    Outputs="hello.exe">  

    <Csc  
        Sources="@(CSFile)"   
        OutputAssembly="hello.exe"/>  
</Target>  

ターゲットで入力と出力が指定されている場合は、各出力を 1 つの入力のみにマップできるか、出力と入力の間に直接マッピングがないかのいずれかになります。When inputs and outputs are specified in a target, either each output can map to only one input or there can be no direct mapping between the outputs and inputs. たとえば前の Csc タスクでは、出力 hello.exe はどの単一の入力にもマップできず、すべての入力に依存します。In the previous Csc Task, for example, the output, hello.exe, cannot be mapped to any single input - it depends on all of them.

注意

入力と出力の間の直接マッピングがないターゲットは、各ターゲットが 1 つの出力だけにマップできるターゲットよりもより頻繁にビルドされます。これは、入力の一部が変更された場合に、どの出力を再ビルドする必要があるかを MSBuildMSBuild が判断できないからです。A target in which there is no direct mapping between the inputs and outputs will always build more often than a target in which each output can map to only one input because MSBuildMSBuild cannot determine which outputs need to be rebuilt if some of the inputs have changed.

LC タスクなど、出力と入力間の直接マッピングを識別できるタスクは、多くの入力から出力アセンブリを生成する CscVbc などとは異なり、インクリメンタル ビルドに最も適しています。Tasks in which you can identify a direct mapping between the outputs and inputs, such as the LC Task, are most suitable for incremental builds, unlike tasks such as Csc and Vbc, which produce one output assembly from a number of inputs.

Example

次の例では、架空のヘルプ システムのヘルプ ファイルをビルドするプロジェクトを使用します。The following example uses a project that builds Help files for a hypothetical Help system. プロジェクトは、ソースの .txt ファイルを、中間の .content ファイルに変換し、これを XML メタデータ ファイルと結合してヘルプ システムで使用される最終の .help ファイルを生成することによって機能します。The project works by converting source .txt files into intermediate .content files, which then are combined with XML metadata files to produce the final .help file used by the Help system. プロジェクトでは、次の仮想タスクを使用します。The project uses the following hypothetical tasks:

  • GenerateContentFiles: .txt ファイルを .content ファイルに変換します。GenerateContentFiles: Converts .txt files into .content files.

  • BuildHelp: .content ファイルと XML メタデータ ファイルを結合し、最終の .help ファイルをビルドします。BuildHelp: Combines .content files and XML metadata files to build the final .help file.

    プロジェクトは、変換を使用して、GenerateContentFiles タスクで入力と出力間の一対一のマッピングを作成します。The project uses transforms to create a one-to-one mapping between inputs and outputs in the GenerateContentFiles task. 詳細については、「MSBuild 変換」をご覧ください。For more information, see Transforms. また、Output 要素が GenerateContentFiles タスクからの出力を BuildHelp タスクの入力として自動的に使用するように設定されます。Also, the Output element is set to automatically use the outputs from the GenerateContentFiles task as the inputs for the BuildHelp task.

    このプロジェクト ファイルには、ConvertBuild の両方のターゲットが含まれます。This project file contains both the Convert and Build targets. GenerateContentFiles タスクと BuildHelp タスクはそれぞれ ConvertBuild のターゲットに配置され、各ターゲットがそれぞれインクリメンタル方式でビルドできるようにします。The GenerateContentFiles and BuildHelp tasks are placed in the Convert and Build targets respectively so that each target can be built incrementally. Output 要素を使用することで、GenerateContentFiles タスクの出力が ContentFile 項目リストに配置され、BuildHelp タスクの入力として使用できます。By using the Output element, the outputs of the GenerateContentFiles task are placed in the ContentFile item list, where they can be used as inputs for the BuildHelp task. このように Output 要素を使用することで、1 つのタスクからの出力が別のタスクの入力として自動的に提供されるため、各タスクで個々の項目または項目リストから手動でリストする必要はありません。Using the Output element in this way automatically provides the outputs from one task as the inputs for another task so that you do not have to list the individual items or item lists manually in each task.

注意

GenerateContentFiles ターゲットはインクリメンタル ビルドできますが、そのターゲットからのすべての出力は BuildHelp ターゲットの入力とし常に要求されます。Although the GenerateContentFiles target can build incrementally, all outputs from that target always are required as inputs for the BuildHelp target. MSBuildMSBuild は、Output 要素を使用する場合に、1 つのターゲットからのすべての出力を別のターゲットの入力として自動的に提供します。 automatically provides all the outputs from one target as inputs for another target when you use the Output element.

<Project DefaultTargets="Build"  
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >  

    <ItemGroup>  
        <TXTFile Include="*.txt"/>  
        <XMLFile Include="\metadata\*.xml"/>  
    </ItemGroup>  

    <Target Name = "Convert"  
        Inputs="@(TXTFile)"  
        Outputs="@(TXTFile->'%(Filename).content')">  

        <GenerateContentFiles  
            Sources = "@(TXTFile)">  
            <Output TaskParameter = "OutputContentFiles"  
                ItemName = "ContentFiles"/>  
        </GenerateContentFiles>  
    </Target>  

    <Target Name = "Build" DependsOnTargets = "Convert"  
        Inputs="@(ContentFiles);@(XMLFiles)"  
        Outputs="$(MSBuildProjectName).help">  

        <BuildHelp  
            ContentFiles = "@(ContentFiles)"  
            MetadataFiles = "@(XMLFile)"  
            OutputFileName = "$(MSBuildProjectName).help"/>  
    </Target>  
</Project>  

参照See Also

ターゲット Targets
Target 要素 (MSBuild) Target Element (MSBuild)
変換 Transforms
Csc タスク Csc Task
Vbc タスクVbc Task