在Visual Studio中“将所有警告视为错误,但……除外”


124

在Visual Studio中,我可以选择“将警告视为错误”选项,以防止在有任何警告的情况下编译我的代码。我们的团队使用此选项,但我们希望保留两个警告作为警告。

有一个选项可以禁止显示警告,但是我们确实希望它们显示为警告,所以这行不通。

看来,获得所需行为的唯一方法是在“特定警告”文本框中输入每个C#警告编号的列表,但我们希望将其视为警告的两个除外。

除了维护上的麻烦之外,此方法的最大缺点是一些警告没有数字,因此无法明确引用。例如,“无法解析此引用。无法找到程序集'Data ....'。”

有人知道更好的方法吗?


为那些看不到为什么有用的人澄清。考虑一下大多数警告的工作方式。他们告诉您刚刚编写的代码有些不对劲。修复它们大约需要10秒钟,这使代码库更加整洁。

“过时”警告与此完全不同。有时修复它意味着只使用一个新的方法签名。但是,如果整个类都已过时,并且您的用法分散在成千上万的代码行中,则修复可能需要数周甚至更长的时间。您不希望这么长时间破坏构建,但是您确实希望看到关于它的警告。这不仅仅是一个假设的情况-这发生在我们身上。

文字上的“#警告”警告也很独特。我经常签入,但是我不想破坏构建。


您能否在大数字列表中放入空格?它塞满了换行符。
Ray

Gawd我讨厌人们制定的复杂规则,通常是为了抚慰某个人的自我。
乔恩·林贾普

21
我明白他关于过时警告的观点,这不是任意的。
Ed S.

以我的经验,在您的构建中甚至允许一个警告就像添加一个第一次异步/等待。很快会有几十个。我记得在所有设置中,开发人员在VS的“错误列表”窗口中看到的警告少于10条。我敢打赌,一旦您收到5条以上的警告,团队中的绝大多数开发人员将无法发现新的警告-在您进行设置时,这意味着他们将不会察觉该方法已过时的警告,这无济于事发出警告的整个目的是:)您对Neil的体验是什么?
tymtam '16

@mayu,这是一个难题。很多时候,我看到警告在很长一段时间内都被忽略了。但是最后,您要么显示警告,要么什么都不显示。如果显示警告,则至少有人会从中学习到一些有用的信息。如果将大多数警告视为错误,那么剩下的警告可能会引起更多关注。
尼尔

Answers:


155

您可以WarningsNotAsErrors在项目文件中添加-tag。

<PropertyGroup>
    ...
    ...
    <WarningsNotAsErrors>618,1030,1701,1702</WarningsNotAsErrors>
</PropertyGroup>

注意:612618都是关于过时的警告,不知道有什么区别,但是我正在处理的项目正在报告警告618的过时。


24
612和618之间的区别是ObsoleteAttribute的注释。不加评论的ObsoleteAttribute生成错误612,以及一个用注释生成618
马尔科·斯帕茨

确实是@MarcoSpatz。然后,我们可以将[Obsolete]message是”的成员null视为错误,而让“ message已设置”的成员仅保留警告。如果error参数设置为trueObsoleteAttribute,改为生成CS0619。如果message是这样,这似乎不起作用null(但是谁会做[Obsolete(null, true)]呢?)。
Jeppe Stig Nielsen

对于F#,--warnaserror-:618,1030在Build-> Other flags字段上使用。F#项目尚未实现此项目选项。github.com/Microsoft/visualfsharp/issues/3395
阿西克

2
知道“ WarningsNotAsErrors”存在。它应在项目设置中可用,而无需手动编辑文件。谢谢。
AFract

1
微软确实搞砸了(11年后,还没有解决问题!)。项目设置change <NoWarn>,这在大多数情况下是次要的,并且无法放入<WarningsNotAsErrors>UI中。荣誉
user2864740

13

/ warnaserror / warnaserror-:618


1
谢谢您的意见。即使它们不能解决IDE问题,但它们是迄今为止最有用的注释。
尼尔

2
您在哪里添加?
checho 2015年

@checho,这些开关将在调用msbuild时添加到命令行中。就我们的目的而言,最重要的答案是更有帮助的,因为我们可以将其烘焙到项目中,而不必修改我们调用msbuild的方式。
尼尔

不适用于MSBuild 15.9.21 + g9802d43bc3:MSBUILD : error MSB1001: Unknown switch. Switch: /warnaserror-:618
Paul

3

或更具体地说,在您的情况下:

/ warnaserror / warnaserror-:612,1030,1701,1702

这应该将所有警告视为错误,但逗号分隔列表中的警告除外


1

为什么要继续看到不被视为错误的警告?我对为什么这是理想的感到困惑-要么修复它们,要么不修复它们。

可以使用两个不同的构建/解决方案文件-还是可以复制一个脚本然后再修改警告/警告级别的脚本。似乎您可能想让编译器的某些执行变得混乱,而其他一些您想一直保持下去。

因此,不同的编译器开关似乎是一个不错的选择。您可以使用不同的目标来执行此操作-一个标记为debug或release,另一个标记为警告。


7
大多数警告的发生是由于代码中的一个简单混乱(例如,我声明了一个我不使用的变量)。由于他人代码的更改,经常会发生过时的警告。解决此问题可能需要花费数周的时间。#warning是我想要在代码中发出的警告(可能是长期修复)。
尼尔

4
换句话说,有警告我不想破坏我的构建。如果#warning破坏了构建,那么我将永远无法签入。如果Obsolete破坏了构建,那么我们依赖的另一个团队可能会在不知不觉中仅通过添加一个过时的属性就破坏了我们团队的构建。
尼尔

@Neil我同意您的一些观点,但是删除不使用的变量不会花费很多时间,并且您肯定想知道另一个团队已经过时了。
tymtam '16

@mayu,感谢您的评论。我同意您不使用的var。这就是为什么我会让编译器将其视为错误。我也同意您确实想知道什么时候过时了。但是,如果重构代码的时间过长而无法忍受,您的选择是1)将此警告视为警告2)让构建长时间处于崩溃状态3)其他一些解决方案,例如将警告作为错误关闭。由于大多数警告都是错误,因此警告列表可能会很短,因此您更有可能注意到它们的显示时间。您首选的解决方案是什么?
尼尔,

1
@mayu,另一个团队(无论是在同一公司内还是在其外部)可能合法地希望传达某个类,方法,其他组件在一段时间内将被淘汰。添加属性是向图书馆的使用者传达这一信息的好方法。我认为这样做并不麻烦。实际上,尽早添加属性是确保其他人了解未来更改的好方法。
尼尔

1

我正在将警告视为错误。

在极少数情况下,如果出现一些可以接受的警告(即,引用过时的成员或缺少XML序列化类的文档),则必须使用#pragma disable显式禁止它(并且可以选择提供没有干净代码的原因)作为评论)。

此指令的存在还可以找出(如果有任何疑问)谁接受了此警告违规(通过版本控制的“非议”行为)。


3
尽管它不能解决我的描述中提到的问题,但我也使用它。我希望将某些警告视为警告,而不是隐藏。
尼尔

0

为什么不简单地说一条规则:“凡检入代码中除612、1030、1701或1702以外的任何警告的人都必须进入白板并写下一百次,'我将不会再次检入带有不允许的警告的代码。 '”


9
祝你好运执行的是......警告作为错误是提高整体的代码质量非常重要的一步,并会迫使开发者真正解决他们的代码!所有冰雹自动化,体力劳动是那么 20世纪:ISH!
Andreas Magnusson,2012年

@AndreasMagnusson如果只有警告的缺乏才能真正确保代码的质量
。–

2
@ user2864740:同意,没有银弹。但是,在它不是灵丹妙药的前提下,拒绝有用的东西实在是太普遍了。
Andreas Magnusson


-4

在我看来,根本的问题实际上是您将警告视为错误(如果不是明显的错误)以及您明显允许违反这一规定的入住政策的结合。如您所说,尽管有警告,您仍希望能够继续工作。您仅提到了一些您希望能够忽略的警告,但是如果团队中的其他人引起了其他任何类型的警告,那将花费您同样长的时间来解决?您是否也想忽略它?

逻辑解决方案是:1)如果代码未编译则不允许签入(这意味着创建警告的人将不得不对其进行修复,因为实际上他们破坏了构建),或者2)将警告视为警告。创建两个构建配置,一个将警告视为错误,可以定期运行以确保代码没有警告,而另一个,仅将它们视为警告,即使其他人引入了警告,您也可以工作。


1
使用选定的答案,可以很容易地将警告添加到被视为警告的警告列表中。这比您提出的任何一种解决方案都要好得多。警告显然不是错误,但是将大多数警告视为错误意味着永远不会使用这些警告来检入代码。
尼尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.