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

时间:2016-05-27 07:58:42

标签: visual-studio visual-c++ visual-studio-2012 msbuild visual-c++-2012

作为构建的一部分,我们有一个项目(.vcxproj),它只包含一个带有Custom Build Tool构建的python脚本,命令行:$(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将这些警告视为错误?

1 个答案:

答案 0 :(得分:1)

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

  

... msbuild将python脚本的输出识别为警告。但它可以   以及bash,perl,php脚本或类似的东西。的MSBuild   将输出识别为警告,我想将这些警告视为   错误。 ...

对于MSBuild中可以想到的任何工具,没有通用的“将警告转为错误”。怎么可能呢? MSBuild调用的每个工具都有其中一种方法,如果有的话。例如,C ++编译器和C#编译器具有特定的命令行选项,这些选项由msbuild文件包含在命令行中,用于这些语言 - 核心msbuild引擎无法做到这一点。

所以你需要做的是指示工具(问题上下文中的python)在你想要的时候这样做。您可以使用现有/众所周知的属性(TreatWarningsAsErrors)作为触发器来完成此操作。如果它具有特定值(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 - 任务CustomErrorRegularExpression - 属性来指定一个正则表达式,该工具应该被treatet作为“错误输出”(这里是python.exe)。

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

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

(未经测试!)应该让你开始。

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

同样,关于您对其他潜在工具的评论,请注意上述方法还需要有关其他工具的具体知识以及它们如何格式化警告(如果它们完全相同),因为您需要自定义正则表达式它们。

所以,即使这种方法需要有关您调用的工具的特定知识,而不是msbuild。

我可能完全不在这里,你真的有一个不同的问题,问题或需要。检查您的问题的评论,看起来我不是唯一一个,因此您可能需要更改您的问题或使其更精确(可能通过您已经尝试过的示例)以获得进一步/更好的帮助