"Behandeln Sie alle Warnungen als Fehler außer ..." in Visual Studio


124

In Visual Studio kann ich die Option "Warnungen als Fehler behandeln" auswählen, um zu verhindern, dass mein Code kompiliert wird, wenn Warnungen vorhanden sind. Unser Team verwendet diese Option, aber es gibt zwei Warnungen, die wir als Warnungen behalten möchten.

Es gibt eine Option zum Unterdrücken von Warnungen, aber wir möchten, dass sie als Warnungen angezeigt werden, damit dies nicht funktioniert.

Es scheint, dass die einzige Möglichkeit, das gewünschte Verhalten zu erzielen, darin besteht, eine Liste aller C # -Warnnummern in das Textfeld "Spezifische Warnungen" einzugeben, mit Ausnahme der beiden, die als Warnungen behandelt werden sollen.

Neben den Wartungsproblemen besteht der größte Nachteil dieses Ansatzes darin, dass einige Warnungen keine Nummern enthalten und daher nicht explizit referenziert werden können. Beispiel: "Diese Referenz konnte nicht aufgelöst werden. Die Assembly 'Daten ....' konnte nicht gefunden werden."

Kennt jemand einen besseren Weg, dies zu tun?


Klärung für diejenigen, die nicht sofort sehen, warum dies nützlich ist. Überlegen Sie, wie die meisten Warnungen funktionieren. Sie sagen Ihnen, dass in dem Code, den Sie gerade geschrieben haben, etwas nicht stimmt. Es dauert ungefähr 10 Sekunden, um sie zu reparieren, und das hält die Codebasis sauberer.

Die Warnung "Veraltet" unterscheidet sich stark davon. Manchmal bedeutet das Beheben nur das Konsumieren einer neuen Methodensignatur. Wenn jedoch eine ganze Klasse veraltet ist und Sie sie in Hunderttausenden von Codezeilen verwenden, kann die Korrektur Wochen oder länger dauern. Sie möchten nicht, dass der Build so lange unterbrochen wird, aber Sie möchten auf jeden Fall eine Warnung dazu sehen. Dies ist nicht nur ein hypothetischer Fall - das ist uns passiert.

Literale "#warning" -Warnungen sind ebenfalls einzigartig. Ich möchte es oft einchecken, aber ich möchte den Build nicht brechen.


Können Sie bitte Leerzeichen in Ihre große Zahlenliste einfügen? Es hat die Zeilenumhüllung vollgestopft.
Ray

Gawd Ich hasse komplizierte Regeln, die von Menschen aufgestellt werden, oft um das Ego einer bestimmten Person zu beruhigen.
Jon Limjap

21
Ich sehe seinen Standpunkt bezüglich der veralteten Warnung, dies ist nicht willkürlich.
Ed S.

Nach meiner Erfahrung ist das Zulassen einer einzigen Warnung in Ihrem Build wie das Hinzufügen einer ersten asynchronen / wartenden Warnung. Bald werden es zehn sein. Ich erinnere mich, dass ein Entwickler in allen Setups weniger als 10 Warnungen im Fenster Fehlerliste in VS sehen kann. Ich kann wetten, dass die überwiegende Mehrheit der Entwickler in einem Team, sobald Sie mehr als 5 Warnungen haben, keine neue erkennen kann. In Ihrem Setup bedeutet dies, dass sie die Warnung nicht erkennen, dass die Methode veraltet ist, die sich widersetzt der ganze Zweck, es zu warnen :) Was ist deine Erfahrung mit diesem Neil?
Tymtam

@ Mayu, es ist ein Rätsel. Ich habe oft gesehen, dass Warnungen lange Zeit ignoriert wurden. Aber am Ende zeigen Sie entweder die Warnung oder Sie zeigen überhaupt nichts. Wenn Sie die Warnung anzeigen, besteht zumindest die Möglichkeit, dass jemand etwas Nützliches daraus lernt. Wenn Sie die meisten Warnungen als Fehler behandeln, können die wenigen verbleibenden Warnungen mehr Aufmerksamkeit erhalten.
Neil

Antworten:


155

Sie können WarningsNotAsErrorsder Projektdatei ein -tag hinzufügen .

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

Hinweis: 612und 618sind beide Warnungen über abgekündigt, weiß nicht den Unterschied , aber das Projekt i auf gerade arbeite berichtet Obsolete mit 618 Warnung.


24
Der Unterschied zwischen 612 und 618 ist der Kommentar des ObsoleteAttribute. Ein veraltetes Attribut ohne Kommentar erzeugt den Fehler 612, und eines mit einem Kommentar erzeugt 618.
Marco Spatz

@MarcoSpatz Genau. Dann können wir [Obsolete]Mitglieder, bei denen das messageist, nullals Fehler behandeln, während diejenigen, bei denen das gesetzt messageist, nur Warnungen bleiben. Wenn der errorParameter gesetzt ist truein der ObsoleteAttributewird ein CS0619 stattdessen erzeugt. Dies scheint nicht funktionieren , wenn messageist null(aber wer täte [Obsolete(null, true)]sowieso?).
Jeppe Stig Nielsen

Verwenden Sie für F # --warnaserror-:618,1030das Feld Build-> Other Flags. Diese Projektoption ist für F # -Projekte noch nicht implementiert. github.com/Microsoft/visualfsharp/issues/3395
Asik

2
Gut zu wissen, dass "WarningsNotAsErrors" vorhanden ist. Es sollte in den Projekteinstellungen verfügbar sein, ohne die Datei manuell bearbeiten zu müssen. Vielen Dank.
Nach dem

1
Microsoft hat das wirklich vermasselt (und 11 Jahre später hat es nichts repariert!). Die Projekteinstellungen ändern sich <NoWarn>, was in den meisten Fällen minderwertig ist und nicht <WarningsNotAsErrors>in die Benutzeroberfläche eingefügt werden konnte. Ein großes Lob.
user2864740

13

/ warnaserror / warnaserror-: 618


1
Danke für deinen Beitrag. Obwohl sie das IDE-Problem nicht lösen, sind dies die bisher hilfreichsten Kommentare.
Neil

2
Wo fügst du das hinzu?
Checho

@checho, diese Schalter werden in der Befehlszeile hinzugefügt, wenn msbuild aufgerufen wird. Für unsere Zwecke ist die Top-Antwort hilfreicher, da wir sie in das Projekt einbinden können, anstatt die Art und Weise ändern zu müssen, wie wir msbuild aufrufen.
Neil

Funktioniert nicht mit MSBuild 15.9.21 + g9802d43bc3: MSBUILD : error MSB1001: Unknown switch. Switch: /warnaserror-:618
Paul B.

3

oder genauer gesagt in Ihrem Fall:

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

Dies sollte alle Warnungen als Fehler behandeln, mit Ausnahme derjenigen in Ihrer durch Kommas getrennten Liste


1

Warum möchten Sie weiterhin Warnungen sehen, die Sie nicht als Fehler behandeln? Ich bin verwirrt darüber, warum dies wünschenswert ist - entweder Sie reparieren sie oder Sie tun es nicht.

Würden zwei verschiedene Build- / Lösungsdateien funktionieren - oder wäre ein Skript zum Kopieren einer und zum Ändern der Warnungen / Warnstufe geeignet? Es scheint, dass Sie vielleicht möchten, dass einige Ausführungen des Compilers kreischen, andere aber Sie möchten weitermachen.

Verschiedene Compiler-Switches scheinen also ein guter Weg zu sein. Sie können dies mit verschiedenen Zielen tun - einem mit Debug oder Release gekennzeichneten und einem mit den Warnungen entsprechend gekennzeichneten Zielen.


7
Die meisten Warnungen treten aufgrund einer einfachen Verwirrung in meinem Code auf (z. B. habe ich eine Variable deklariert, die ich nicht verwende). Eine veraltete Warnung tritt häufig aufgrund einer Änderung des Codes einer anderen Person auf. Die Behebung dieses Problems kann Wochen dauern. #warning ist eine Warnung, die ich im Code haben möchte (wahrscheinlich eine langfristige Korrektur).
Neil

4
Mit anderen Worten, es gibt Warnungen, dass ich meinen Build nicht brechen möchte. Wenn #warning den Build bricht, kann ich nie einen einchecken. Wenn Obsolete den Build bricht, kann ein anderes Team, auf das wir angewiesen sind, den Build unseres Teams unwissentlich brechen, indem es einfach ein veraltetes Attribut hinzufügt.
Neil

@Neil Ich stimme einigen Ihrer Argumente zu, aber das Entfernen einer nicht verwendeten Variablen nimmt nicht viel Zeit in Anspruch UND Sie möchten auf jeden Fall wissen, dass ein anderes Team etwas veraltet gemacht hat.
Tymtam

@ Mayu, danke für deinen Kommentar. Ich stimme einer Var zu, die Sie nicht verwenden. Deshalb würde ich den Compiler als Fehler behandeln lassen. Ich stimme auch zu, dass Sie wissen möchten, wenn etwas veraltet ist. Wenn es jedoch unerschwinglich lange dauert, etwas Veraltetes Ihres Codes zu überarbeiten, haben Sie die Wahl: 1) Behandeln Sie diese Warnung als Warnung. 2) Lassen Sie Ihren Build lange Zeit kaputt bleiben. 3) Eine andere Lösung wie das Deaktivieren von Warnungen als Fehler. Bei den meisten Warnungen als Fehler bleibt Ihre Warnliste wahrscheinlich kurz, sodass Sie eher bemerken, wenn sie angezeigt werden. Was ist Ihre bevorzugte Lösung?
Neil

1
@mayu, ein anderes Team (ob innerhalb oder außerhalb desselben Unternehmens) möchte möglicherweise zu Recht mitteilen, dass eine Klasse, eine Methode oder eine andere Komponente über einen bestimmten Zeitraum auslaufen. Das Hinzufügen eines Attributs ist eine gute Möglichkeit, dies den Verbrauchern einer Bibliothek zu signalisieren. Ich sehe es nicht als mühsam an, dies zu tun. Wenn Sie das Attribut so früh wie möglich hinzufügen, können Sie sicherstellen, dass andere über zukünftige Änderungen informiert sind.
Neil

1

Ich verwende Warnungen als Fehler behandeln.

In seltenen Fällen, wenn eine akzeptable Warnung angezeigt wird (z. B. Verweisen auf veraltete Mitglieder oder fehlende Dokumentation zu XML-Serialisierungsklassen), muss diese explizit mit #pragma disable unterdrückt werden (und optional kann ein Grund dafür angegeben werden, dass kein sauberer Code vorhanden ist als Kommentar mit).

Das Vorhandensein dieser Richtlinie ermöglicht es auch herauszufinden, wer diese Warnverletzung akzeptiert hat (durch "Schuld" -Aktion der Versionskontrolle), falls es einige Fragen gibt.


3
Ich benutze dies auch, obwohl es die in meiner Beschreibung genannten Probleme nicht löst. Ich möchte, dass bestimmte Warnungen als Warnungen behandelt und nicht ausgeblendet werden.
Neil

0

Warum nicht einfach eine Regel haben, die besagt: "Wer Code mit einer anderen Warnung als 612, 1030, 1701 oder 1702 eincheckt, muss zum Whiteboard gehen und hundertmal schreiben." Ich werde keinen Code mit unzulässigen Warnungen erneut einchecken. '"


9
Viel Glück beim Durchsetzen ... Warnungen als Fehler zu behandeln ist ein sehr wichtiger Schritt, um die Gesamtcodequalität zu verbessern, und es wird Entwickler dazu zwingen, ihren Code tatsächlich zu korrigieren! Alle Hagelautomatisierung, Handarbeit ist so 20. Jahrhundert: ish!
Andreas Magnusson

@AndreasMagnusson Wenn nur das Fehlen von Warnungen tatsächlich die Qualität des Codes
sicherstellte

2
@ user2864740: Einverstanden, es gibt keine Silberkugeln. Aber es ist ein allzu häufiger Irrtum, etwas Nützliches unter der Voraussetzung abzulehnen, dass es keine Silberkugel ist.
Andreas Magnusson


-4

Es scheint mir, dass das Hauptproblem in der Tat darin besteht, dass Sie Warnungen als Fehler behandeln, wenn dies eindeutig nicht der Fall ist, und dass Sie offensichtlich Check-ins zulassen, die dies verletzen. Wie Sie sagen, möchten Sie trotz einer Warnung weiterarbeiten können. Sie haben nur einige Warnungen erwähnt, die Sie ignorieren möchten, aber was ist, wenn jemand anderes im Team eine andere Art von Warnung verursacht, deren Behebung ebenso lange dauern würde? Möchten Sie das nicht auch ignorieren können?

Die logische Lösung wäre, entweder 1) Checkins nicht zuzulassen, wenn der Code nicht kompiliert wird (was bedeutet, dass diejenigen, die die Warnungen erstellt haben, diese korrigieren müssen, da sie den Build tatsächlich abgebrochen haben) oder 2) Warnungen als Warnungen zu behandeln. Erstellen Sie zwei Build-Konfigurationen, eine, die Warnungen als Fehler behandelt, die regelmäßig ausgeführt werden können, um sicherzustellen, dass der Code warnungsfrei ist, und eine andere, die sie nur als Warnungen behandelt und es Ihnen ermöglicht, auch dann zu arbeiten, wenn eine andere Person eine Warnung eingeführt hat.


1
Mit der ausgewählten Antwort können Sie der Liste der als Warnungen behandelten Warnungen einfach hinzufügen. Das funktioniert viel besser als jede Ihrer vorgeschlagenen Lösungen. Warnungen sind eindeutig keine Fehler. Wenn Sie jedoch die meisten Warnungen als Fehler behandeln, wird der Code niemals mit diesen Warnungen eingecheckt.
Neil
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.