【问题标题】:Ignoring generated files when using "Treat warnings as errors"使用“将警告视为错误”时忽略生成的文件
【发布时间】:2010-04-30 08:44:45
【问题描述】:

我们已经开始了一个新项目,但现有项目也存在这个问题。问题是当我们编译时警告级别为 4 我们还想打开

'将所有警告视为错误'

我们目前无法执行此操作,因为生成的文件(特别是 reference.cs 文件)缺少 XML cmets 之类的内容,这会生成警告,我们不想完全禁止所有文件中的 xml 注释警告仅针对特定类型的文件(即生成的代码)。

我已经想到了一种可以实现的方法,但不确定这些是否是最好的方法,或者确实从哪里开始 :) 我的想法是我们需要使用 T4 模板为代码做一些事情生成,以便它确实为生成的代码填写 XML 文档。

有没有人有任何想法,目前我的警告超过 2k(这是一个大项目):(

【问题讨论】:

  • 您可以设置单个源文件的属性,包括单个源文件的编译器选项。这些将推翻从项目级别继承的属性。
  • 我确实对上述内容发表了评论,但是是的,这是如何实现的,请您举个例子。
  • 抱歉,我不确定这是否适用于 C#。对于 C++,在解决方案资源管理器窗口中,您可以右键单击单个文件的文件名并设置其属性。有时我需要用与其他选项不同的选项编译一个源文件,这至少在 C++ 中有效。
  • 是的,恐怕用 c# 是不可能的。 (不是明显的右键单击方式)

标签: c# visual-studio visual-studio-2010 msbuild


【解决方案1】:

您可以使用编译指示选择性地禁用警告:

// Disable warning messages 4507 and 4034.
#pragma warning( disable : 4507 34 )

如果您可以在生成的代码文件中发出此类警告(或#include),那么您就完成了。

或者,您可以在编译器的命令行上全局禁用它们:

/wd4326 disables compiler warning C4326.

然后在您想要它们的文件中重新启用它们(通过头文件):

// Report warning 4326 as an error.
#pragma warning( error : 326 )

最后,您可以通过更改项目文件中的属性来为每个源文件设置不同的编译选项。我个人觉得这是维护的噩梦,但有时你别无选择。

编辑:我看到您的源文件是 C#,而不是 C++。

使用 C# 命令行:

to suppress CS0028, you could specify /nowarn:28.

不幸的是,/warnaserror 使 all 警告错误。

【讨论】:

  • 有趣的是,您在下面说(Windows 程序员)您可以在 .csproj 属性中基于每个源文件更改属性,但我找不到这是如何实现的。这是在 Suppress warnings: text box 中完成的吗?老实说,我非常想忽略生成的代码。
  • 恐怕你必须使用 C# 命令行编译器 (csc.exe)。
  • 这个想法是,一旦你添加了#pragma 警告禁用,你就设置好了。您只需更新一次代码生成器。您是否必须选择更改代码生成器?
【解决方案2】:

我编写了一个调用 svcutil 的 PowerShell 脚本,然后使用 #pragma 指令包装自动生成的代码以忽略丢失的 xml,但仍然允许我根据需要重新生成。

$outFile = 'generatedCode_fromSVCUTIL.cs'
svcutil '..\XML Schema\myXsd.xsd' /dataContractOnly /n:'*,MyNamespace.GeneratedCode' /language:C#  /importxmltypes /out:$outFile

# ----------------------------------------------------- 
# Exempt this file from XML documentation requirements

Write-Host 'Wrapping ', $outFile, ' in #pragma 1591 flags' 
$a = Get-Content $outFile 

# Set up pragma lines for enabling and disabling the XML doc warning
$disableWarning = '#pragma warning disable 1591'
$restoreWarning = '#pragma warning restore 1591'

# wrap the generated code in the pragma tags
Set-Content $outFile –value $disableWarning, $a, $restoreWarning 
Write-Host 'Done.' 

【讨论】:

  • 更好的解决方案。将此更改为已接受的答案,因为它不涉及更改对象的可见性。
【解决方案3】:

在 VS 2010 中,您可以右键单击服务引用,选择“配置服务引用...”并将访问修饰符从 Public 更改为 Internal。
这当然可能不适合您的特定解决方案,但警告不适用于内部方法,您仍然可以重新生成服务引用。

【讨论】:

    【解决方案4】:

    对于 C#,您可以简单地放置一个

    #pragma warning disable 1591
    

    reference.cs 文件的开头。则不会发出有关缺少 XML 文档的警告。

    但是您每次都必须这样做,文件会重新生成(即当您的服务定义更改时)。我不知道有任何方式会影响代码生成(我不确定他们是否使用 T4 模板或这些模板可能位于何处......)

    【讨论】:

    • 是的,这就是问题所在。每次都必须这样做,这是维护的噩梦,看起来很有用,但如果可能的话,我希望每次都加入。
    【解决方案5】:

    一些想法。

    1) 你的文件头中是否有自动生成的标签(文件顶部的cmets),如下所示:

    // <auto-generated>

    // This file is auto-generated...

    // </auto-generated>

    这个标签很重要(内容不重要),因为一些工具会跳过这些文件(例如 StyleCop 可以配置为忽略这些文件)。

    2) 如果您要自动生成代码,为什么不至少自动生成一些 XML cmets?我可以理解您不想花费大量时间来记录可能永远不会被阅读的代码,但是在调试代码时,我经常发现自己会进入一些自动生成的代理,甚至一个简单的注释也会有所帮助,甚至如果它只是说“自动生成的代码”:)

    编辑

    3) 您还可以通过将编译指示添加到构建选项来抑制警告(右键单击项目,选择属性,选择构建选项卡)。这比添加代码更方便。尝试将 1591;1574;1587 添加到 Suppress Warnings 框中。

    4) 您可以进入项目属性中的代码分析选项卡并取消选中“将警告视为错误”以查看导致您出现问题的特定警告。

    显然这两个都是全局设置,它们不只是选择自动生成的文件。

    【讨论】:

    • 恐怕这并不能解决问题,Visual Studio 在生成文档时似乎忽略了这些标题存在的事实。
    • 好的,在我的列表中添加了另一个想法:)
    • 我不明白为什么这会导致投反对票,投反对票的人至少可以有礼貌地发表评论说这个回复有什么问题吗?
    • 这里所有的 cmets 都很有用,但不幸的是并没有解决手头的问题。这里的主要问题是似乎没有办法轻松地将警告作为自动生成的代码上的错误忽略,也许如果 VS2010 中有一个选项可以将其设置为自定义代码注入,这将解决维护问题。在可能的时间之前,总会有人重新生成代码并忘记编译指示,然后破坏我试图自动化该步骤的构建。
    猜你喜欢
    • 2017-11-08
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    相关资源
    最近更新 更多