Usar la memoria de forma eficaz al generar grandes proyectos
Actualización: noviembre 2007
Con frecuencia, los proyectos grandes contienen muchos subproyectos y otras dependencias, y éstos pueden consumir mucha memoria del sistema en tiempo de compilación. Cuando se disminuye la memoria del sistema disponible, puede disminuir también el rendimiento del sistema. MSBuild 3.5 reduce este problema ya que descarga los proyectos de la memoria cuando terminan de generarse, pero retiene los resultados de la compilación en una memoria caché para su posterior recuperación.
Descargar proyectos, almacenar en memoria caché y recuperar los resultados
En versiones anteriores de MSBuild, los proyectos permanecían en la memoria una vez generados. MSBuild 3.5 introduce una propiedad de tarea denominada UnloadProjectsOnCompletion, que permite quitar un proyecto de la memoria una vez completada la compilación.
Sin embargo, cuando un proyecto se ha descargado de la memoria, no se puede volver a cargar en la misma instancia de la compilación. Debido a que una compilación suele tener destinos a los que se debe llamar para recopilar información en un proyecto, descargar un proyecto de la memoria durante una compilación puede producir problemas. Para resolver esto, MSBuild 3.5 introduce otra propiedad denominada UseResultsCache, que se puede utilizar para almacenar en memoria caché los resultados de destino (por ejemplo, resultados de la compilación, elementos y propiedades) de todos los proyectos que se están generando.
Dado que un proyecto ocupa más memoria que el resultado de su compilación, descargar el proyecto pero mantener sus resultados es utilizar la memoria de forma más eficaz. UnloadProjectsOnCompletion y UseResultsCache trabajan juntos para mejorar el rendimiento de la compilación no sólo liberando memoria, sino también permitiendo que MSBuild recupere los resultados de la compilación directamente de la memoria en lugar de los archivos en disco.
Ejemplo
En el ejemplo siguiente se muestra cómo usar UnloadProjectsOnCompletion y UseResultsCache. En este ejemplo, hay dos proyectos, MyProj1.proj y MyProj2.proj.
MyProj1.proj
<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="default">
<Message Text="Project: MyProj1. Target: default" />
<CallTarget Targets="Normal" UseResultsCache="true"/>
</Target>
<Target Name="Normal" Outputs="Someoutput from second target">
<Message Text="Project: MyProj1. Target: second" />
</Target>
</Project>
MyProj2.proj
<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="default">
<Message Text="Project: MyProj2.proj Target: default" />
<MSBuild Projects=" MyProj1.proj" Targets="default"
UnloadProjectsOnCompletion="true" />
<MSBuild Projects=" MyProj1.proj" Targets="Normal"
UnloadProjectsOnCompletion="true" >
<Output TaskParameter="TargetOutputs"
PropertyName="TargetOutput"/>
</MSBuild>
<Message Text="Output from project: MyProj2.proj target: second
= $(TargetOutput)" />
</Target>
</Project>
Al generar MyProj2.proj en la línea de comandos mediante msbuild.exe MyProj2.proj /tv:3.5, debería ver el resultado del destino Normal de MyProj1 imprimiendo desde MyProj2.