MSBuild:处理内联任务

时间:2013-08-10 16:45:14

标签: msbuild multiprocessing inline-code

我在Windows 2008 x64上使用MSBuild(Framework版本v4.0.30319 - 32位一)。 想了解MSBuild如何管理内联任务。它会在每次调用任务时编译一次吗?或者它会编译一次并重新用于每次调用任务吗?

我使用“/ m”参数运行MSBuild并尝试在C#代码中引入故意错误。 MSBuild将我指向1个文本文件(在我的个人资料文件夹中的某个临时文件夹下)。没有生成其他文本文件。但是,如果没有错误,我不知道如何计算。

我试图解决这个问题的意图: 要知道这对于与使用编译的dll(而不是内联任务)相同的顺序是否有效。如果编译只发生一次,那么编译内联任务代码的微不足道的开销是可以接受的(因为我将节省代码和二进制文件的SCM方面)。

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="default" ToolsVersion="4.0">
  <Target Name="default">
    <ItemGroup>
      <A Include="1;2;3;4;5;6;7;8;9;10"/>
    </ItemGroup>
    <MSBuild Projects="$(MSBuildProjectFullPath)"
             BuildInParallel="true"
             Targets="Echoer"
             ToolsVersion="4.0"
             StopOnFirstFailure="true"
             Properties="Prop=%(A.Identity)"/>
  </Target>
  <Target Name="Echoer">
    <MyTask WhatToEcho="$(Prop)"/>
  </Target>
  <UsingTask TaskName="MyTask" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
      <WhatToEcho ParameterType="System.String" Required="True"/>
    </ParameterGroup>
    <Task>
      <Code Language="cs" Type="Fragment">
        <![CDATA[
        Log.LogMessage("Property received: "+WhatToEcho);
        ]]>
      </Code>
    </Task>
  </UsingTask>
</Project>

1 个答案:

答案 0 :(得分:3)

在我的机器上使用MSBuild 4.5在ProcMon下运行您的示例会显示以下内容:

  1. MSBuild根据用户%TEMP%文件夹下的构建生成一次临时程序集。 (实际上是csc.exe创建了程序集,但我认为这只是对代码生成方式的副作用。)
  2. 源代码位于临时.cs文件中,也位于%TEMP%。
  3. 在构建结束时,将删除所有文件(源文件以及输出程序集)。
  4. 换句话说,在构建期间,您将在第一次调用任务时看到一个性能。对该任务的所有后续调用都将使用缓存程序集。在构建之后,缓存将丢失,必须再次重新创建程序集,这意味着如果您在快速增量构建之后,您可能会从预编译的DLL中受益。