在生成大型项目时有效使用内存
更新: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 时,应该可以看到 MyProj1 的目标 Normal 的输出,而该输出由 MyProj2 在屏幕上显示。