gpt4 book ai didi

msbuild - 如果使用 ContinueOnError=true,如何检查 MSBuild-Task 是否失败

转载 作者:行者123 更新时间:2023-12-03 23:24:53 31 4
gpt4 key购买 nike

我正在使用 运行 MSBuild 任务ContinueOnError =真:

<MSBuild Projects="@(ComponentToDeploy)"
Targets="$(DeploymentTargets)"
Properties="$(CommonProperties);%(AdditionalProperties)"
ContinueOnError="true"
Condition="%(Condition)"/>

所以我的构建总是成功。

有没有办法找出是否发生任何错误?

我找不到包含此信息的 MSBuild 任务的任何输出。
我知道的唯一方法是解析日志文件中的错误,但这对我来说似乎是一种解决方法。

(我使用的是 MSBuild 4.0)

这是对@Ilya 的最后反馈的回答。
由于评论的长度和格式限制,我正在使用反馈/答案。

Log is scoped to individual targets or to be more specific tasks...



这确实是我在阅读您的评论并建议使用 Log.HasLoggedErrors 时出现的第一个问题。 :“ 是日志的范围吗? ”。
不幸的是,我找不到合适的文档。 MSND 没有多大帮助...
为什么你知道它的范围是任务?
我对你的说法一点都不怀疑!我只是想知道某处是否有适当的文档..
(我多年来一直没有使用 MSBuild ;-)

In any case, what are you building as project?



我的测试项目非常简单。
我的测试项目
<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="ElenasTarget" ToolsVersion="4.0">

<UsingTask AssemblyFile="$(MSBuildProjectDirectory)\MyCompany.Tools.MSBuild.Tasks.dll" TaskName="MSBuildWithHasLoggedErrors" />

<ItemGroup>
<MyProjects Include="CopyNotExistingFile.proj" />
</ItemGroup>

<Target Name="ElenasTarget">
<MSBuildWithHasLoggedErrors Projects="@(MyProjects)" ContinueOnError="true" >
<Output TaskParameter="HasLoggedErrors" PropertyName="BuildFailed" />
</MSBuildWithHasLoggedErrors>

<Message Text="BuildFailed=$(BuildFailed)" />
</Target>
</Project>

CopyNotExistingFile.proj 只是尝试复制一个不存在的文件:
<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Target1" ToolsVersion="4.0">
<Target Name="Target1">
<Copy SourceFiles="C:\lalala.bum" DestinationFiles="C:\tralala.bam" />
</Target>
</Project>

这是我的自定义任务 MSBuildWithHasLoggedErrors

namespace MyCompany.Tools.MSBuild.Tasks
{
public class MSBuildWithHasLoggedErrors : Microsoft.Build.Tasks.MSBuild
{
[Output]
public bool HasLoggedErrors { get; private set; }

public override bool Execute()
{
try
{
base.Execute();
HasLoggedErrors = Log.HasLoggedErrors;
}
catch (Exception e)
{
Log.LogErrorFromException(e, true);
return false;
}

return true;
}
}
}

如果我构建 MyTest.proj HasLoggedErrors将设置为 false虽然错误 (MSB3021) 被记录 (?) 到控制台记录器:
Project "C:\Users\elena\mytest.proj" on node 1 (default targets).
Project "C:\Users\elena\mytest.proj" (1) is building "C:\Users\elena\CopyNotExistingFile.proj" (2) on node 1 (default targets).
Target1:
Copying file from "C:\lalala.bum" to "C:\tralala.bam".
C:\Users\elena\CopyNotExistingFile.proj(5,4): error MSB3021: Unable to copy file "C:\lalala.bum" to "C:\tralala.bam". Could not find file 'C:\lalala.bum'.
Done Building Project "C:\Users\elena\CopyNotExistingFile.proj" (default targets) -- FAILED.
ElenasTarget:
BuildFailed=False
Done Building Project "C:\Users\elena\mytest.proj" (default targets).

Build succeeded.

我的期望是 HasLoggedErrors将设置为 true .


one way is to build self but with different target, for example your DefaultTargets one launches your custom MSBuildWrapper task pointing to itself (ie $(MSBuildProjectFile)) but with a different target that does other builds, copies



我已经尝试过了(这是我在帖子中的意思的调查)。不幸的是它也不起作用:-(
(我知道你说的是理论上)。
我的新 单例项目如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="ElenasTarget" ToolsVersion="4.0">

<UsingTask AssemblyFile="$(MSBuildProjectDirectory)\MyCompany.Tools.MSBuild.Tasks.dll" TaskName="MSBuildWithHasLoggedErrors" />

<Target Name="ElenasTarget">
<MSBuildWithHasLoggedErrors Projects="$(MSBuildProjectFile)" Targets="CopyNotExistingFile" ContinueOnError="true" >
<Output TaskParameter="HasLoggedErrors" PropertyName="BuildFailed" />
</MSBuildWithHasLoggedErrors>

<Message Text="BuildFailed=$(BuildFailed)" />
</Target>

<Target Name="CopyNotExistingFile" >
<Copy SourceFiles="C:\lalala.bum" DestinationFiles="C:\tralala.bam" />
</Target>
</Project>

如果我构建这个项目 HasLoggedErrors仍将设置为 false .
(此外,我目前维护的“真实”构建要复杂得多,其中包含多个带有目标的项目文件......所以我无法将它们全部打包到一个项目文件中)。

or writing custom logger and passing it through command line



那是我最后的希望!
我的“真实”构建 通过命令行传递的自定义记录器(为了简单起见,我没有将它用于我的测试项目)。这实际上是在生成日志(一个 XML 文件),我将对其进行解析以查明是否记录了任何错误。
顺便说一句,我认为控制台记录器是一种“全局”记录器。 我错了吗?

无论如何,自定义记录器也无济于事, Log.HasLoggedErrors仍然设置为 false .
有什么我不知道的方法可以引用特定的记录器(例如我的自定义记录器)来询问它是否记录了任何错误?

真的很像 Log范围仅限于单个目标。

嗯...如果对 buildengine 实例的反射是最后的手段,我仍然更喜欢解析日志。
(别怪我!:-))

我的决定
经过一些调查,我决定坚持我最初的解决方案:解析日志以找出构建是否失败。

检查我的评论,看看为什么我更喜欢到目前为止提供的建议。

如果有人有其他想法,请随时分享:-)

(否则这个问题可以关闭,我想......)

最佳答案

MSBuildLastTaskResult reserved property将设置为 True如果最后一个任务成功并且 False如果最后一个任务失败:

<MSBuild Projects="@(ComponentToDeploy)"
Targets="$(DeploymentTargets)"
Properties="$(CommonProperties);%(AdditionalProperties)"
ContinueOnError="true"
Condition="%(Condition)" />
<Message Text="MSBuild failed!" Condition="'$(MSBuildLastTaskResult)' == 'False'" />

我相信这是在 MSBuild v4.0 中引入的。

关于msbuild - 如果使用 ContinueOnError=true,如何检查 MSBuild-Task 是否失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10796733/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com