gpt4 book ai didi

MSBuild:处理内联任务

转载 作者:行者123 更新时间:2023-12-03 22:15:08 25 4
gpt4 key购买 nike

我正在 Windows 2008 x64 上使用 MSBuild(框架版本 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>

最佳答案

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

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

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

    关于MSBuild:处理内联任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18164166/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com