Compilaciones incrementalesIncremental builds

Las compilaciones incrementales son compilaciones que se optimizan para que no se ejecuten los destinos que tienen archivos de salida que están actualizados con respecto a sus archivos de entrada correspondientes.Incremental builds are builds that are optimized so that targets that have output files that are up-to-date with respect to their corresponding input files are not executed. Un elemento de destino puede tener un atributo Inputs, que indica qué elementos el destino espera como entrada, y un atributo Outputs, que indica qué elementos genera como salida.A target element can have both an Inputs attribute, which indicates what items the target expects as input, and an Outputs attribute, which indicates what items it produces as output. MSBuild intenta buscar una asignación 1 a 1 entre los valores de estos atributos.MSBuild attempts to find a 1-to-1 mapping between the values of these attributes. Si existe una asignación 1 a 1, MSBuild compara la marca de tiempo de cada elemento de entrada con la marca de tiempo de su elemento de salida correspondiente.If a 1-to-1 mapping exists, MSBuild compares the time stamp of every input item to the time stamp of its corresponding output item. Los archivos de salida que no tienen ninguna asignación 1 a 1 se comparan con todos los archivos de entrada.Output files that have no 1-to-1 mapping are compared to all input files. Un elemento se considera actualizado si su archivo de salida tiene una antigüedad igual o inferior a la de su archivo o archivos de entrada.An item is considered up-to-date if its output file is the same age or newer than its input file or files.

Nota

Cuando MSBuild evalúa los archivos de entrada, solo se tiene en cuenta el contenido de la lista en la ejecución actual.When MSBuild evaluates the input files, only the contents of the list in the current execution are considered. Los cambios que se realicen en la lista desde la última compilación no harán que un destino se desproteja automáticamente.Changes in the list from the last build do not automatically make a target out-of-date.

Si todos los elementos de salida están actualizados, MSBuild omite el destino.If all output items are up-to-date, MSBuild skips the target. Esta compilación incremental del destino puede mejorar significativamente la velocidad de compilación.This incremental build of the target can significantly improve the build speed. Si solo están actualizados algunos archivos, MSBuild ejecuta el destino pero omite los elementos actualizados, actualizando de ese modo todos los elementos.If only some files are up-to-date, MSBuild executes the target but skips the up-to-date items, and thereby brings all items up-to-date. Este proceso se conoce como compilación incremental parcial.This process is known as a partial incremental build.

Las asignaciones 1 a 1 son generadas normalmente por transformaciones de elementos.1-to-1 mappings are typically produced by item transformations. Para obtener más información, consulte Transformaciones.For more information, see Transforms.

Considere el destino siguiente.Consider the following target.

<Target Name="Backup" Inputs="@(Compile)"
    Outputs="@(Compile->'$(BackupFolder)%(Identity).bak')">
    <Copy SourceFiles="@(Compile)" DestinationFiles=
        "@(Compile->'$(BackupFolder)%(Identity).bak')" />
</Target>

El conjunto de archivos representado por el tipo de elemento Compile se copia en un directorio de copia de seguridad.The set of files represented by the Compile item type is copied to a backup directory. Los archivos de copia de seguridad tienen la extensión de nombre de archivo .bak.The backup files have the .bak file name extension. Si los archivos representados por el tipo de elemento Compile, o los archivos de copia de seguridad correspondientes, no se eliminan o modifican después de ejecutarse el destino Backup, este destino se omite en compilaciones subsiguientes.If the files represented by the Compile item type, or the corresponding backup files, are not deleted or modified after the Backup target is run, then the Backup target is skipped in subsequent builds.

Inferencia de salidaOutput inference

MSBuild compara los atributos Inputs y Outputs de un destino para determinar si el destino tiene que ejecutarse.MSBuild compares the Inputs and Outputs attributes of a target to determine whether the target has to execute. Idealmente, el conjunto de archivos que existe después de completarse una compilación incremental debe permanecer inalterado se ejecuten o no los destinos asociados.Ideally, the set of files that exists after an incremental build is completed should remain the same whether or not the associated targets are executed. Dado que las propiedades y los elementos creados o modificados por tareas pueden afectar a la compilación, MSBuild debe deducir sus valores aunque el destino que los afecta se omita.Because properties and items that are created or altered by tasks can affect the build, MSBuild must infer their values even if the target that affects them is skipped. Este proceso se conoce como inferencia de salida.This process is known as output inference.

Existen tres casos:There are three cases:

  • El destino tiene un atributo Condition que se evalúa como false.The target has a Condition attribute that evaluates to false. En este caso, el destino no se ejecuta y no tiene ningún efecto en la compilación.In this case, the target is not run, and has no effect on the build.

  • El destino tiene salidas sin actualizar y se ejecuta para actualizarlas.The target has out-of-date outputs and is run to bring them up-to-date.

  • El destino no tiene salidas sin actualizar y se omite.The target has no out-of-date outputs and is skipped. MSBuild evalúa el destino y realiza cambios en los elementos y las propiedades como si el destino se hubiera ejecutado.MSBuild evaluates the target and makes changes to items and properties as if the target had been run.

Para admitir la compilación incremental, las tareas deben asegurarse de que el valor de atributo TaskParameter de cualquier elemento Output sea igual a un parámetro de entrada de tarea.To support incremental compilation, tasks must ensure that the TaskParameter attribute value of any Output element is equal to a task input parameter. Estos son algunos ejemplos:Here are some examples:

<CreateProperty Value="123">
    <Output PropertyName="Easy" TaskParameter="Value" />
</CreateProperty>

Este código crea la propiedad Easy, que tiene el valor "123" tanto si el destino se ejecuta o se omite como si no.This code creates the property Easy, which has the value "123" whether or not the target is executed or skipped.

A partir de MSBuild 3.5, la inferencia de salida se realiza automáticamente en los grupos de elementos y propiedades de un destino.Starting in MSBuild 3.5, output inference is performed automatically on item and property groups in a target. Las tareas CreateItem no se requieren en un destino y se deben evitar.CreateItem tasks are not required in a target and should be avoided. Además, las tareas CreateProperty deben utilizarse en un destino solamente para determinar si se ha ejecutado un destino.Also, CreateProperty tasks should be used in a target only to determine whether a target has been executed.

Antes de MSBuild 3.5, puede usar la tarea CreateItem.Prior to MSBuild 3.5, you can use the CreateItem task.

Determinar si se ha ejecutado un destinoDetermine whether a target has been run

Debido a la inferencia de salida, se tiene que agregar una tarea CreateProperty a un destino para examinar las propiedades y los elementos con el fin de poder determinar si se ha ejecutado el destino.Because of output inference, you have to add a CreateProperty task to a target to examine properties and items so that you can determine whether the target has been executed. Agregue la tarea CreateProperty al destino y proporciónele un elemento Output cuyo valor de atributo TaskParameter sea "ValueSetByTask".Add the CreateProperty task to the target and give it an Output element whose TaskParameter is "ValueSetByTask".

<CreateProperty Value="true">
    <Output TaskParameter="ValueSetByTask" PropertyName="CompileRan" />
</CreateProperty>

Este código crea la propiedad CompileRan y le proporciona el valor true, pero solo si se ejecuta el destino.This code creates the property CompileRan and gives it the value true, but only if the target is executed. Si el destino se omite, no se crea CompileRan.If the target is skipped, CompileRan is not created.

Vea tambiénSee also