如何将警告视为自定义构建的错误?

How to treat warnings as errors for custom builds?

作为我们构建的一部分,我们有一个项目 (.vcxproj),其中仅包含一个 python 脚本和 Custom Build Tool 构建,命令行:$(python_bin)/python.exe %(FullPath)。 Msbuild 能够解析此 python 脚本的警告并在构建后显示它们:

"F:\Generators.vcxproj" (default target) (1) ->
(CustomBuild target) -> 
  F:\Tool.py(274): warning : OPSEC [F:\Generators.vcxproj]
  F:\Tool.py(274): warning : OPSEC [F:\Generators.vcxproj]

    2 Warning(s)
    0 Error(s)

现在,我怎样才能强制它把这些警告当作错误来处理?我找到的唯一选项是 Treat Linker Warning As Errors,这显然没有帮助,因为这个项目的链接没有完成(因为它只是一个带有自定义构建的 .py 文件)而且无论如何这些警告来自构建步骤。

我什至尝试将 <TreatWarningAsError>true</TreatWarningAsError> 添加到 ClCompile 部分。没有帮助。

如何强制 msbuild 将这些警告视为错误?

让我从你最近的评论开始:

... msbuild recognized output of python script as warnings. but it could as well be bash, perl, php script or something like that. msbuild recognizes output as warning, and I want to treat those warnings as error. ...

在 MSBuild 中,任何 工具都没有通用的 "turn warnings into errors"。怎么可能呢? MSBuild 调用的每个工具都有其一种执行此操作的方法(如果有的话)。例如,C++ 编译器和 C# 编译器具有特定的命令行选项,这些选项由这些语言的 msbuild 文件包含在它们的命令行中——核心 msbuild 引擎无法执行任何操作。

所以您需要做的是指示工具(python 在问题的上下文中)在您需要时执行此操作。您可以使用已知 属性 (TreatWarningsAsErrors) 的 existing/well 作为触发器来执行此操作。如果它具有特定值 (true),那么您需要做任何您需要做的事情,让您的工具将警告作为错误发出并采取相应措施。

示例:

<PropertyGroup>
    <PythonCmd>$(python_bin)\python.exe</PythonCmd>
    <PythonCmd Condition="'$(TreatWarningsAsErrors)' == 'true'">$(PythonCmd) -W error</PythonCmd>
    <PythonCmd>$(PythonCmd) %(FullPath)</PythonCmd>
</PropertyGroup>

<Exec Command="$(PythonCmd)" .../>

现在,如果您不知道如何确切地使python做您想做的事(将警告变成错误),没有 msbuild 魔术可以帮助你做到这一点。您突然 有一个 python 具体问题。因为您现在遇到的实际问题与从 msbuild 或命令行执行的 python 无关。

第二种选择:如果您不能或不想使用 Python 将警告转化为错误的内置功能,您还可以使用 Exec-Tasks CustomErrorRegularExpression-属性 指定应被工具视为 "error output" 的正则表达式(此处为 python.exe)。

类似

 <PropertyGroup>
     <ErrorExp>.*: error :.*</ErrorExp>
     <ErrorExp Condition="'$(TreatWarningsAsErrors)' == 'true'">.*: (warning|error) :.*</ErrorExp>
 </PropertyGroup>

 <Exec ... CustomErrorRegularExpression="$(ErrorExp)"/>

(未经测试!)应该可以帮助您入门。

但是,由于 Python 已经提供了一种将警告设置为错误的方法(似乎通过 -W error),该选项似乎不必要地令人费解。

再次,关于您对可能使用的其他工具的评论,请注意,上述方法还需要有关这些其他工具的特定知识以及它们如何设置警告格式(如果有的话),因为您需要自定义他们的正则表达式。

因此,即使是这种方法也需要有关您调用的工具的特定知识,而不是那么多 msbuild。

我可能完全不在这儿,你真的有不同的问题、问题或需要。检查对您的问题的评论,看来我不是唯一的人,因此您可能需要更改您的问题或使其更精确(可能有您已经尝试过的示例)以获得 further/better 求助