MSBuild:处理内联任务

MSBuild:处理内联任务,msbuild,multiprocessing,inline-code,Msbuild,Multiprocessing,Inline Code,我正在Windows 2008 x64上使用MSBuild(框架版本v4.0.30319-32位1)。 想了解MSBuild如何管理内联任务。它会在每次调用任务时编译一次吗?或者它会编译一次并在每次调用任务时重复使用 我使用“/m”参数运行了MSBuild,并尝试在C代码中引入故意错误。MSBuild将我指向1个文本文件(在我的配置文件文件夹中的某个临时文件夹下)。没有生成其他文本文件。但是,如果没有错误,我不知道如何计算 我试图弄明白这一点的意图是: 了解这是否与使用已编译dll(而不是内联任

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

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

我试图弄明白这一点的意图是: 了解这是否与使用已编译dll(而不是内联任务)的效率相同。如果编译只发生一次,那么编译内联任务代码的最小开销是可以接受的(因为我将保存代码和二进制文件的SCM方面)





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

  • MSBuild在用户%TEMP%文件夹下为每个生成生成生成一次临时程序集。(实际上是csc.exe创建了程序集,但我认为这只是代码生成方式的一个副作用)
  • 源代码在临时的.cs文件中,也在%TEMP%下
  • 生成结束时,将删除所有文件(源文件以及输出程序集)

  • 换句话说,在构建过程中,您将在第一次调用任务时看到性能命中。对任务的所有后续调用都将使用缓存的程序集。生成缓存丢失后,必须重新创建程序集,这意味着如果您正在进行快速增量生成,您可能会从预编译的DLL中受益。

    与您的问题无关,但您发布的示例不会执行并行生成。在您的情况下,对task的调用将在循环中顺序执行,因此“BuildInParallel”属性的值将不会生效。如果您想要真正的并行生成,则必须创建多个项目文件,并将它们以“项目”属性传递给MSBuild任务。@sevativ感谢您的输入。“我不知道。”塞瓦蒂托夫,你好,塞瓦。从一位资深同事那里,我学到了并行执行同一MSBuild文件中的目标的技巧。有关示例,请参见此问题:。它确实需要向Projects属性传递一个ItemGroup。我应该想到普洛克蒙。但永远不会太迟:-)。将在后续测试中接受该提示。
    <?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>