방법: 증분 빌드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. 변환에 대한 자세한 내용은 변환을 참조하세요.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 요소의 InputsOutputs 특성을 사용합니다.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>  

대상에 입력 및 출력이 지정된 경우 각 출력은 하나의 입력에만 매핑될 수 있습니다. 그렇지 않으면 출력과 입력 간에 직접 매핑이 없을 수 있습니다.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.

참고

입력과 출력 간에 직접 매핑이 없는 대상은 항상 각 출력이 하나의 입력에만 매핑될 수 있는 대상보다 더 자주 빌드됩니다. 이는 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 파일로 변환하는 방식으로 작동합니다. .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. 자세한 내용은 변환을 참조하세요.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. 각 대상이 증분식으로 빌드될 수 있도록 GenerateContentFilesBuildHelp 작업은 각각 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 요소를 이 방법으로 사용하면 한 작업의 출력이 다른 작업의 입력으로 자동으로 제공되므로 각 작업에서 개별 항목 또는 항목 목록을 수동으로 나열할 필요가 없습니다.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. Output 요소를 사용할 경우 MSBuildMSBuild에서는 한 작업의 모든 출력을 다른 대상의 입력으로 자동으로 제공합니다.MSBuildMSBuild 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"/>  
        <XMLFiles 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 = "@(XMLFiles)"  
            OutputFileName = "$(MSBuildProjectName).help"/>  
    </Target>  
</Project>  

참고 항목See Also

대상 Targets
Target 요소(MSBuild) Target Element (MSBuild)
변환 Transforms
Csc 작업 Csc Task
Vbc 작업Vbc Task