대규모 프로젝트 빌드 시 메모리의 효율적인 사용
업데이트: 2007년 11월
대규모 프로젝트는 종종 많은 하위 프로젝트와 다른 종속성을 포함하고 있고 빌드 시 많은 시스템 메모리를 사용할 수 있습니다. 사용 가능한 시스템 메모리가 줄어들면 시스템 성능도 저하될 수 있습니다. MSBuild 3.5에서는 빌드가 완료되면 메모리에서 프로젝트를 언로드하지만 나중에 검색하기 위해 빌드 결과를 캐시에 유지하여 이 문제를 제거합니다.
프로젝트 언로드, 결과 캐시 및 결과 검색
이전 버전의 MSBuild에서는 프로젝트가 빌드된 후에도 메모리에 남아 있었습니다. MSBuild 3.5에는 빌드가 완료된 후 메모리에서 프로젝트를 제거하는 데 사용할 수 있는 UnloadProjectsOnCompletion이라는 작업 속성이 도입되었습니다.
그러나 프로젝트가 메모리에서 언로드되면 이 프로젝트를 동일한 빌드 인스턴스에 다시 로드할 수 없습니다. 빌드에는 종종 프로젝트에 정보를 수집하기 위해 호출해야 하는 대상이 있기 때문에 빌드하는 동안 메모리에서 프로젝트를 언로드하면 문제가 발생할 수 있습니다. 이 문제를 해결하기 위해 MSBuild 3.5에는 빌드하고 있는 모든 프로젝트의 대상 결과(예: 빌드 결과, 항목 및 속성)를 캐시하는 데 사용할 수 있는 UseResultsCache라는 또 다른 속성이 도입되었습니다.
프로젝트가 해당 빌드 결과보다 많은 메모리를 차지하기 때문에 프로젝트만 언로드하고 해당 결과는 유지하면 메모리를 보다 효율적으로 사용할 수 있습니다. UnloadProjectsOnCompletion 및 UseResultsCache는 메모리를 비울 뿐 아니라 MSBuild가 디스크에 있는 파일이 아닌 메모리에서 직접 빌드 결과를 검색할 수 있도록 하여 빌드 성능을 향상시키기 위해 함께 작동합니다.
예제
다음 예제에서는 UnloadProjectsOnCompletion 및 UseResultsCache의 사용 방법을 보여 줍니다. 이 예제에는 MyProj1.proj와 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>
msbuild.exe MyProj2.proj /tv:3.5를 사용하여 명령줄에서 MyProj2.proj를 빌드하면 MyProj2에서 인쇄되는 MyProj1에 있는 대상 Normal의 출력 내용이 표시되어야 합니다.