Я работаю с MSBuild (версия Framework v4.0.30319 - 32-разрядная) в Windows 2008 x64. Хотел понять, как MSBuild управляет встроенными задачами. Будет ли он компилироваться один раз за вызов задачи? Или он будет компилироваться один раз и повторно использоваться для каждого вызова задачи?
Я запустил MSBuild с аргументом «/m» и попытался внести преднамеренную ошибку в код 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>