让我从示例开始...我有一个与此类似的 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 实用程序。 (通过 ToolTaskExtension)这样您就可以跟踪 ExitCode。如果不编写自己的任务来扩展该任务,这有点棘手。如果您使用目标批处理,则可以调用 AspNetCompiler 任务,然后将每个 ExitCode 写入文件中。然后查看该文件是否有非零退出代码。您可能需要考虑编写自己的自定义任务来扩展 AspNetCompiler 任务,编写起来应该非常简单。
有关批处理的更多信息,请参阅 http://sedotech.com/Resources#Batching 上的资源.
关于MsBuild - 是否可以隔离批处理任务,以便一个失败的任务不会跳过剩余的任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2114735/