MsBuild - 是否可以隔离批处理任务,因此一个失败的任务不会跳过剩余的任务?

时间:2010-01-22 03:27:39

标签: msbuild error-handling batch-file msbuild-task

让我以示例开始......我有一个看起来与此类似的all.proj:

<ItemGroup>
  <ProjectsToBuild Include="..\Sites\*\*.csproj" />
</ItemGroup>

<Target Name="DeployWebsites" DependsOnTargets="BuildMergedSolutions">
  <AspNetCompiler 
    PhysicalPath="%(ProjectsToBuild.RootDir)%(ProjectsToBuild.Directory)"
    TargetPath="%(ProjectsToBuild.RootDir)%(ProjectsToBuild.Directory)..\..\..\deploy\%(ProjectsToBuild.Filename)"
    VirtualPath="/%(ProjectsToBuild.Filename)%(ProjectsToBuild.Extension)"
    Debug="true"
    Updateable="true"
    Force="true" />
</Target>

如果其中一个任务失败,它将退出目标。有没有办法只打印错误并继续执行其余任务?

ContinueOnError不是一个选项,因为它只会将错误转换为警告。我希望构建最终失败,但我也想获得尽可能多的错误信息,所以我仍然需要编译所有站点,即使其中一些站点失败。

1 个答案:

答案 0 :(得分:3)

唯一可以执行此操作的方法是,您可以检测何时发生错误。基本上,任务必须写出一些工件,或者给你一个输出参数,你可以告诉它是否失败。您将使用它与为任务本身设置ContinueOnError为true。我们的想法是,将ContinueOnError设置为true,允许完成所有任务调用,然后查看是否存在错误并采取相应措施。

我为从MSBuild执行单元测试做了类似的事情。我希望所有单元测试都在所有测试程序集中执行,但也希望在构建完成后使构建失败。所以我所做的是将ContinueOnError设置为true,然后搜索结果写入的XML文件以查找任何失败的测试用例,同时我也聚合了该文件中的消息。

在您的情况下,AspNetCompiler任务不会写出任何此类文件。 AspNetCompiler通过扩展ToolTask(通过ToolTask​​Extension)来包装aspnet_compiler.exe实用程序,以便您可以跟踪ExitCode。如果没有编写自己的任务来扩展该任务,那就有点棘手了。如果使用目标批处理,则可以调用AspNetCompiler任务,然后将每个ExitCode写入文件。然后在那之后查看该文件和非零退出代码。您可能需要考虑编写自己的自定义任务,该任务扩展了AspNetCompiler任务,编写起来非常简单。

有关批处理的更多信息,请参阅http://sedotech.com/Resources#Batching上的资源。