如何通过MSBuild中的自定义记录器查看正在对项目列表执行的任务的当前“步骤”?

时间:2010-11-17 13:56:38

标签: msbuild msbuild-task

我提前道歉,因为我甚至不知道如何正确地说出我需要的东西,所以我会尝试更详细地解释一下:

我们正在使用MSBuild构建自动部署过程。我们的软件安装程序需要在我们环境中的某些机器上运行多次,因为我们必须设置单独的实例。我们这样做的方法是创建'list'(如果这是正确的术语,像@(name)这样的变量)要完成的任务,描述要运行的安装的元数据,运行它的实例,以及机器,然后骑自行车通过所有这些。此外,我们正在以同步方式关闭和重新启动服务。

基本上,我们的问题在于想要将故障分开并将它们限制在特定实例中以用于我们的记录器。当引发警告时,有没有办法将当前任务的属性暴露给记录器?理想情况下(对于任何用途)它将是后解析,因此如果属性是:

<Exec Command="install%(InstanceName.ShortName).bat" />

我们可以在记录器中查看该属性并查看当前它正在运行'installfoo.bat'吗?

1 个答案:

答案 0 :(得分:2)

您描述的功能称为批处理。如果我正确地阅读了您的问题,您希望能够在发生错误或其他事件时记录构建所在的批处理。

查看ILogger界面我不认为可以完成 - 只有任务知道已经传递给它的批次项目。我猜你想要为一堆不同的内置任务做这个,所以一个解决方法就是将任务包装在一个你可以记录任何你喜欢的目标中。

<Project xmlns=...>
    <Target Name="Build">
        <ItemGroup>
            <InstanceName Include="Foo Instance">
                <ShortName>foo</ShortName>
            </InstanceName>
            <InstanceName Include="Bar Instance">
                <ShortName>bar</ShortName>
            </InstanceName>
        </ItemGroup>

        <MSBuild Projects="$(MSBuildProjectFile)"
                 Targets="BatchedExec"
                 Properties="CurrentInstance=%(InstanceName.Identity);
                     CurrentShortName=%(ShortName)">
        </MSBuild>
    </Target>

    <Target Name="BatchedExec">
        <Message Text="CurrentInstance: $(CurrentInstance)" />
        <Message Text="CurrentShortName: $(CurrentShortName)" />

        <Exec Command="install$(CurrentShortName).bat">
            <Output TaskParameter="ExitCode" PropertyName="ExitCode"/>
        </Exec>

        <Message Text="install$(CurrentShortName).bat exited with code $(ExitCode)." />
    </Target>
</Project>

在此示例中,为每个批次调用BatchedExec目标,您可以在调用任务之前记录您喜欢的任何信息。您可以为要使用批处理参数运行的每个任务创建类似的目标。