2

让我从例子开始......我有一个 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 不是一个选项,因为它只会将错误转换为警告。我希望构建最终失败,但我也希望获得尽可能多的错误信息,因此即使其中一些站点失败,我仍然需要编译所有站点。

4

1 回答 1

3

您可以做到这一点的唯一方法是您可以检测到何时发生错误。基本上,该任务必须写出一些工件,或者向您提供一个输出参数,您可以在其中判断它是否失败。您可以将它与将任务本身的 ContinueOnError 设置为 true 一起使用。想法是,将 ContinueOnError 设置为 true,允许所有任务调用完成,然后查看是否存在错误并采取相应措施。

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

在您的情况下,AspNetCompiler 任务不会写出任何此类文件。AspNetCompiler 通过扩展ToolTask ​​(通过 ToolTask​​Extension)来封装 aspnet_compiler.exe 实用程序,以便您可以跟踪 ExitCode。如果不编写您自己的任务来扩展该任务,这有​​点棘手。如果您使用 Target Batching,您可以调用 AspNetCompiler 任务,然后将每个 ExitCode 写入文件。然后在该文件中查看非零退出代码。您可能要考虑编写自己的自定义任务来扩展 AspNetCompiler 任务,编写起来应该非常简单。

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

于 2010-01-22T04:29:29.397 回答