Visual Studioの「すべての警告をエラーとして扱う...」


124

Visual Studioでは、[警告をエラーとして扱う]オプションを選択して、警告がある場合にコードがコンパイルされないようにすることができます。私たちのチームはこのオプションを使用していますが、警告として残しておきたい警告が2つあります。

警告を抑制するオプションがありますが、警告として表示したいので機能しません。

警告として扱う2つを除いて、すべてのC#警告番号のリストを[特定の警告]テキストボックスに入力するのが唯一の方法のようです。

メンテナンスの頭痛のほかに、このアプローチの最大の欠点は、いくつかの警告に番号がないため、明示的に参照できないことです。たとえば、「この参照を解決できませんでした。アセンブリ 'Data ....'が見つかりませんでした」

誰かがこれを行うためのより良い方法を知っていますか?


なぜこれが有用なのかすぐにわからない人のために明確にします。ほとんどの警告がどのように機能するかを考えてください。彼らはあなたが書いたばかりのコードで何かが少しずれているとあなたに言っています。それらを修正するのに約10秒かかり、コードベースをよりクリーンに保ちます。

「廃止」警告はこれとは大きく異なります。時々それを修正することは、単に新しいメソッドシグネチャを消費することを意味します。ただし、クラス全体が古く、数十万行のコードに分散して使用されている場合、修正に数週間以上かかることがあります。あなたはビルドがその間破壊されることを望んでいませんが、間違いなくそれについての警告を見たいと思っています。これは単なる仮説的なケースではなく、私たちにも起こりました。

文字通りの "#warning"警告もユニークです。私は頻繁にしたいそれをチェックするために、私は、ビルドを壊したくはありません。


数字の大きなリストにスペースを入れてもらえますか?行の折り返しが詰まっています。
レイ

ああ、私は人々によって作られる複雑なルールを嫌い、しばしば特定の人のエゴを和らげるために。
Jon Limjap 2008

21
私は時代遅れの警告について彼の要点を見ます、これは恣意的ではありません。
Ed S.

私の経験では、ビルドで警告を1つでも許可することは、最初の非同期/待機を追加するようなものです。すぐにそれらの数十があります。すべての設定で、開発者はVSの[エラーリスト]ウィンドウに10未満の警告を表示できることを覚えています。警告が5つを超えるとすぐに、チームの大多数の開発者は新しい警告を見つけることができなくなります-セットアップでは、メソッドが古くなっているという古い警告を見つけられないことを意味します警告を出す目的全体:)このニールでの経験は何ですか?
ティムタム16

@mayu、それは難問です。何度も警告が無視されるのを見てきました。しかし、最終的には警告を表示するか、まったく何も表示しません。警告を表示している場合、少なくとも誰かが警告から何かを学ぶ可能性があります。ほとんどの警告をエラーとして扱う場合、残っているいくつかの警告にさらに注意を向けることができます。
Neil

回答:


155

WarningsNotAsErrorsプロジェクトファイルに-tagを追加できます。

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

注:612618どちらも廃止についての警告です。違いはわかりませんが、私が取り組んでいるプロジェクトは、警告618を使用して廃止を報告しています。


24
612と618の違いは、ObsoleteAttributeのコメントです。コメントのないObsoleteAttributeはエラー612を生成し、コメントのあるObsoleteAttributeは618を生成します。–
Marco Spatz

@MarcoSpatzその通りです。次に[Obsolete]messageがであるメンバーnullをエラーとして扱い、messageが設定されているメンバーは警告のままにします。errorパラメータがでに設定さtrueれている場合、ObsoleteAttribute代わりにCS0619が生成されます。もしそうならこれはうまくいかないようmessageですnull[Obsolete(null, true)]とにかく誰がやるのでしょうか?)。
Jeppe Stig Nielsen

F#の場合--warnaserror-:618,1030は、[ビルド]-> [その他のフラグ]フィールドで使用します。このプロジェクトオプションは、F#プロジェクトにはまだ実装されていません。github.com/Microsoft/visualfsharp/issues/3395
Asik

2
「WarningsNotAsErrors」が存在することを知っておくと役立ちます。ファイルを手動で編集しなくても、プロジェクト設定で使用できるはずです。ありがとう。
AFract

1
マイクロソフトはこれを本当に失敗しました(そして11年後、問題は修正されていません!)。プロジェクト設定の変更<NoWarn>は、ほとんどの場合劣って<WarningsNotAsErrors>おり、UI に配置できませんでした。称賛。
user2864740

13

/ warnaserror / warnaserror-:618


1
ご意見ありがとうございます。それらはIDE問題を解決しませんが、これらはこれまでのところ最も役立つコメントです。
Neil、

2
これをどこに追加しますか?
checho 2015

@checho、これらのスイッチは、msbuildを呼び出すときにコマンドラインに追加されます。私たちの目的では、msbuildの呼び出し方法を変更する必要がなく、プロジェクトにベイクできるため、上の答えがより役立ちます。
Neil

MSBuild 15.9.21 + g9802d43bc3では動作しません: MSBUILD : error MSB1001: Unknown switch. Switch: /warnaserror-:618
Paul B.

3

より具体的には、あなたの場合:

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

これは、コンマ区切りのリストにあるものを除いて、すべての警告をエラーとして扱う必要があります


1

エラーとして扱っていないという警告が表示され続けるのはなぜですか?これが望ましい理由について混乱しています。修正するかしないかです。

2つの異なるビルド/ソリューションファイルが機能するか、または1つをコピーしてから、警告/警告レベルを適切に変更するスクリプト。おそらく、コンパイラの一部の実行を弱めたいと思うかもしれませんが、他の実行を続行したいようです。

したがって、別のコンパイラスイッチを使用するのが良い方法のようです。異なるターゲットでこれを行うことができます-1つはデバッグまたはリリースとラベル付けされ、他は警告について適切にラベル付けされます。


7
ほとんどの警告は、コードの単純な混乱が原因で発生します(たとえば、使用しない変数を宣言しました)。廃止された警告は、他の誰かのコードの変更が原因で発生することがよくあります。これを修正するには、開発に数週間かかる場合があります。#warningは、コードに含めたい警告です(おそらく長期的な修正です)。
ニール、

4
つまり、ビルドを壊したくないという警告があります。#warningがビルドを壊すと、チェックインできなくなります。Obsoleteがビルドを壊すと、依存する別のチームが、古い属性を追加するだけで知らずにチームのビルドを壊す可能性があります。
Neil、

私はあなたの引数の一部に同意するが、VARを削除@Neilあなたは使用することは、多くの時間を取ることはありませんしていないあなたは間違いなく、他のチームが廃止された何かをしたことを知ってほしいです。
tymtam '19

@mayu、コメントありがとうございます。使用しない変数について同意します。コンパイラにエラーとして処理させるのはそのためです。また、何かが古くなったことを知りたいと思うことにも同意します。しかし、コードの古くなったものをリファクタリングするのに法外な時間がかかる場合は、1)この警告を警告として扱う2)ビルドを長時間中断させておく3)警告をエラーとしてオフにするなど、他の解決策があります。ほとんどの警告はエラーとして表示されるため、警告リストは短いままになる可能性が高いため、警告が表示されたときに気付く可能性が高くなります。あなたの好ましい解決策は何ですか?
Neil

1
@mayu、別のチーム(同じ会社の内外を問わず)は、クラス、メソッド、その他のコンポーネントが一定期間にわたって段階的に廃止されることを合法的に伝えたい場合があります。属性を追加することは、ライブラリの利用者にこれを知らせる良い方法です。これを行うのが面倒だとは思わない。実際、属性をできるだけ早く追加することは、他のユーザーが将来の変更を認識できるようにするための良い方法です。
Neil

1

警告をエラーとして扱います。

まれなケースですが、許容できる警告が表示された場合(つまり、古いメンバーを参照している場合、またはXMLシリアル化クラスのドキュメントがない場合)、#pragma disableを使用して明示的に抑制する必要があります(オプションで、クリーンなコードがない理由を提供できます)コメントとして)。

このディレクティブの存在により、質問がある場合に誰がこのバージョン違反の「非難」アクションによってこの警告違反を受け入れたかを知ることができます。


3
私の説明でも述べられている問題は解決しませんが、私もこれを使用しています。特定の警告を非表示ではなく警告として扱いたい。
ニール、

0

「612、1030、1701、または1702以外の警告がコード内に含まれている場合、誰もがコードをチェックインし、ホワイトボードに移動して100回書き込む必要があります。許可されていない警告のコードは再度チェックインしません。 「」


9
幸運警告をエラーとして扱うことは、全体的なコードの品質を向上させるために非常に重要なステップであることを...強制し、それが実際にコードを修正するために開発者を強制されます!あられの自動化、手作業はすべて20世紀のようです。
Andreas Magnusson

@AndreasMagnusson警告の欠如だけが実際にコードの品質を保証した場合
ユーザー2864740 2015年

2
@ user2864740:そうですね、特効薬はありません。しかし、それが特効薬ではないという前提で有用なものを拒否することは、あまりにも一般的な誤りです。
Andreas Magnusson 2015年


-4

根本的な問題は、実際には警告をエラーとして扱うことと、明らかにそうでない場合の組み合わせと、これに違反するチェックインを許可するという明らかなポリシーの組み合わせのようです。あなたが言うように、あなたは警告にもかかわらず仕事を続けることができることを望みます。あなたは無視したいいくつかの警告しか述べていませんが、チームの他の誰かが他のタイプの警告を引き起こした場合、修正するのに同じくらい時間がかかりますか?あなたもそれを無視できるようにしたくないですか?

論理的な解決策は、1)コードがコンパイルされない場合にチェックインを許可しない(つまり、警告を作成した人は、実際にはビルドを壊したため、それらを修正する必要がある)、または2)警告を警告として扱うことです。2つのビルド構成を作成します。1つは警告をエラーとして扱い、定期的に実行してコードに警告がないことを保証し、もう1つは警告としてのみ扱い、他の誰かが警告を導入した場合でも作業できるようにします。


1
選択した回答を使用すると、警告として扱われる警告のリストに簡単に追加できます。これは、提案されたいずれのソリューションよりもはるかにうまく機能します。警告は明らかにエラーではありませんが、ほとんどの警告をエラーとして扱うことは、コードがそれらの警告とともにチェックインされることは決してないことを意味します。
ニール、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.