【问题标题】:How to treat warnings as errors for custom builds?如何将警告视为自定义构建的错误?
【发布时间】:2016-09-25 11:14:10
【问题描述】:

作为我们构建的一部分,我们有一个项目 (.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 将这些警告视为错误?

【问题讨论】:

  • 编译器选项适用于 C++,但您收到的警告适用于 Python 代码。
  • 我想了这么多,我只是想把它放在 .vcxproj 的几个地方,看看它是否有帮助。它没有。知道如何让它注册为错误吗?
  • 所以这是一个 [python] 问题,而不是 [visual-c++] 问题。您没有正确标记您的问题。 Just rtfm 找到 -W 选项。
  • 我不知道,我有点怀疑这是 python 特定的问题,我认为它更特定于 msbuild

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


【解决方案1】:

让我从你最近的一位 cmets 开始:

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

对于在 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-Tasks CustomErrorRegularExpression-property 指定正则表达式应该被工具(此处为python.exe)视为“错误输出”。

类似

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

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

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

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

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

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

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

【讨论】:

  • 这不是仅适用于使用warnings 模块发出的警告吗?
  • 坦率地说不知道。将答案更多地视为有关如何将 msbuild 属性映射到 Python 调用的概念。您可能需要调整标签或询问 Python 特定问题,以了解 Python 特定细节。
  • 我不认为我的问题是特定于 python 的
  • 好吧,假设您知道如何详细调用 Python,我向您展示了一种可能的方法来处理您的问题的 msbuild 方面。如果你不这样做,我建议你再问一个问题或详细说明你的问题。
  • 你实际上没有。 msbuild 将 python 脚本的输出识别为警告。但它也可以是 bash、perl、php 脚本或类似的东西。 msbuild 将输出识别为警告,我想将这些警告视为错误。告诉我怎么做,我会很高兴
猜你喜欢
  • 2017-09-10
  • 2016-04-27
  • 1970-01-01
  • 2011-03-15
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多