让我以示例开始......我有一个看起来与此类似的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不是一个选项,因为它只会将错误转换为警告。我希望构建最终失败,但我也想获得尽可能多的错误信息,所以我仍然需要编译所有站点,即使其中一些站点失败。
答案 0 :(得分:3)
唯一可以执行此操作的方法是,您可以检测何时发生错误。基本上,任务必须写出一些工件,或者给你一个输出参数,你可以告诉它是否失败。您将使用它与为任务本身设置ContinueOnError为true。我们的想法是,将ContinueOnError设置为true,允许完成所有任务调用,然后查看是否存在错误并采取相应措施。
我为从MSBuild执行单元测试做了类似的事情。我希望所有单元测试都在所有测试程序集中执行,但也希望在构建完成后使构建失败。所以我所做的是将ContinueOnError设置为true,然后搜索结果写入的XML文件以查找任何失败的测试用例,同时我也聚合了该文件中的消息。
在您的情况下,AspNetCompiler任务不会写出任何此类文件。 AspNetCompiler通过扩展ToolTask(通过ToolTaskExtension)来包装aspnet_compiler.exe实用程序,以便您可以跟踪ExitCode。如果没有编写自己的任务来扩展该任务,那就有点棘手了。如果使用目标批处理,则可以调用AspNetCompiler任务,然后将每个ExitCode写入文件。然后在那之后查看该文件和非零退出代码。您可能需要考虑编写自己的自定义任务,该任务扩展了AspNetCompiler任务,编写起来非常简单。
有关批处理的更多信息,请参阅http://sedotech.com/Resources#Batching上的资源。