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

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

最佳答案

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

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

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

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

关于MsBuild - 是否可以隔离批处理任务,以便一个失败的任务不会跳过剩余的任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2114735/

相关文章:

windows - 是否可以在脚本中重定向批处理文件的输出?

batch-file - Nuget 包并在同一批处理脚本中推送

visual-studio-2010 - 使用 Visual Studio 2010 构建 x64 WIX 项目?

c# - 如何使用 .NET Core csproj 复制链接的内容文件?

entity-framework - 如何修复 EntityFrameworkCore 中的数据迁移错误?

.net - 由于 ZIP 结构,使用 kudu ZipDeploy 的 Azure Web 应用程序部署失败

xslt - xslt 1.0和条件404错误消息

iphone - iPhone/Objective-C的try-catch异常处理实践

php - PHP-捕获引发错误的代码

c++ - 编译现有的 C++ 代码以在 DOS 中运行