Visual Studio의 "다음을 제외한 모든 경고를 오류로 처리"


124

Visual Studio에서 "경고를 오류로 처리"옵션을 선택하여 경고가있는 경우 코드가 컴파일되지 않도록 할 수 있습니다. 우리 팀은이 옵션을 사용하지만 경고로 유지하고 싶은 두 가지 경고가 있습니다.

경고를 억제하는 옵션이 있지만 경고로 표시되기를 원하므로 작동하지 않습니다.

우리가 원하는 동작을 얻는 유일한 방법은 "특정 경고"텍스트 상자에 모든 C # 경고 번호의 목록을 입력하는 것 같습니다. 단, 경고로 처리하려는 두 가지를 제외하고는 말입니다.

유지 관리 문제 외에도이 접근 방식의 가장 큰 단점은 몇 가지 경고에 숫자가 없으므로 명시 적으로 참조 할 수 없다는 것입니다. 예 : "이 참조를 확인할 수 없습니다. '데이터 ....'어셈블리를 찾을 수 없습니다."

누구든지 이것을하는 더 나은 방법을 알고 있습니까?


이것이 왜 유용한 지 즉시 알지 못하는 사람들을 위해 설명합니다. 대부분의 경고가 어떻게 작동하는지 생각해보십시오. 그들은 방금 작성한 코드에서 뭔가 약간 벗어났다고 말합니다. 이를 수정하는 데 약 10 초가 걸리며 코드베이스를 깔끔하게 유지합니다.

"사용되지 않음"경고는 이것과 매우 다릅니다. 때때로 그것을 고치는 것은 단지 새로운 메소드 서명을 소비하는 것을 의미합니다. 그러나 전체 클래스가 쓸모없고 수십만 줄의 코드에 흩어져 사용되는 경우 수정하는 데 몇 주 이상 걸릴 수 있습니다. 빌드가 그렇게 오래 손상되는 것을 원하지는 않지만 경고를보고 싶을 것입니다. 이것은 단지 가상의 경우가 아닙니다. 이것은 우리에게 일어났습니다.

리터럴 "#warning"경고도 고유합니다. 나는 종종 원하는 그것을 체크하기 위해,하지만 난 빌드를 중단하고 싶지 않아요.


큰 숫자 목록에 공백을 넣을 수 있습니까? 줄 바꿈이 채워져 있습니다.
Ray

Gawd 나는 특정한 사람의 자아를 달래기 위해 종종 사람들이 만든 복잡한 규칙을 싫어한다.
Jon Limjap

21
나는 쓸모없는 경고에 대한 그의 주장을 봅니다. 이것은 임의적이지 않습니다.
Ed S.

내 경험상 빌드에서 하나의 경고도 허용하는 것은 첫 번째 async / await를 추가하는 것과 같습니다. 곧 수십명이 될 것입니다. 모든 설정에서 개발자가 VS의 오류 목록 창에서 10 개 미만의 경고를 볼 수 있다는 것을 기억합니다. 5 개 이상의 경고를받는 즉시 팀의 대다수 개발자는 새 경고를 발견 할 수 없습니다. 설정에서 해당 방법이 사용되지 않는다는 경고를 발견하지 못할 것입니다. 경고를받는 모든 목적 :)이 Neil에 대한 귀하의 경험은 무엇입니까?
tymtam

@mayu, 그것은 수수께끼입니다. 여러 번 경고가 오랫동안 무시되는 것을 보았습니다. 그러나 결국 경고를 표시하거나 전혀 표시하지 않습니다. 경고를 표시하고 있다면 적어도 누군가가 그로부터 유용한 것을 배울 가능성이 있습니다. 대부분의 경고를 오류로 취급하면 남은 경고가 더 많은 경고를받을 수 있습니다.

답변:


155

WarningsNotAsErrors프로젝트 파일에 -tag를 추가 할 수 있습니다 .

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

참고 : 612하고 618있습니다 폐기에 대한 모두 경고의 차이를 알 수 없지만 내가 맡은 프로젝트가 618 경고와 함께 폐기보고하고있다.


24
612와 618의 차이점은 ObsoleteAttribute의 주석입니다. 주석이없는 ObsoleteAttribute는 오류 612를 생성하고 주석이있는 항목은 618을 생성합니다.
Marco Spatz 2011 년

@MarcoSpatz 맞습니다. 그럼 우리가 처리 할 수있다 [Obsolete](가) 어디에 회원 messagenull오류로 우리가 어디에 그 수 있도록하면서, 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

@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

오류로 처리하지 않는 경고를 계속 표시하려는 이유는 무엇입니까? 나는 이것이 왜 바람직한 지 혼란 스럽습니다-당신이 그들을 고치 든 그렇지 않든.

두 개의 서로 다른 빌드 / 솔루션 파일이 작동합니까-아니면 하나를 복사하는 스크립트가 있으므로 경고 / 경고 수준을 수정하는 것이 적합합니다. 컴파일러의 일부 실행이 삐걱 거리는 것을 원하지만 나머지는 계속 진행하고 싶은 것 같습니다.

따라서 다른 컴파일러 스위치가 좋은 방법 인 것 같습니다. 이 작업은 디버그 또는 릴리스 레이블이 지정된 다른 대상과 경고에 대해 적절하게 레이블이 지정된 다른 대상으로 수행 할 수 있습니다.


7
대부분의 경고는 내 코드의 단순한 혼동 때문에 발생합니다 (예 : 사용하지 않는 변수를 선언했습니다). Obsolete 경고는 종종 다른 사람의 코드 변경으로 인해 발생합니다. 이 문제를 해결하는 데 몇 주가 걸릴 수 있습니다. #warning은 코드에서 원하는 경고입니다 (장기 수정일 가능성이 있음).
Neil

4
즉, 빌드를 중단하고 싶지 않다는 경고가 있습니다. #warning으로 빌드가 중단되면 체크인 할 수 없습니다. Obsolete가 빌드를 중단하면 우리가 의존하는 다른 팀은 쓸모없는 속성을 추가하는 것만으로도 모르게 우리 팀의 빌드를 중단 할 수 있습니다.
Neil

나는 당신의 주장의 일부에 동의하지만, VAR를 제거 @Neil 당신은 사용은 많은 시간을 고려하지 않습니다하지 않습니다 그리고 당신은 확실히 다른 팀이 사용되지 않는 무언가를 한 것으로 알고 싶어요.
tymtam

@mayu, 귀하의 의견에 감사드립니다. 사용하지 않는 var에 동의합니다. 그것이 내가 컴파일러가 그것을 오류로 취급하게하는 이유입니다. 나는 또한 당신이 어떤 것이 쓸모 없을 때 알고 싶어한다는 것에 동의합니다. 그러나 코드에서 쓸모없는 것을 리팩토링하는 데 엄청나게 오래 걸리는 경우 선택은 1)이 경고를 경고로 취급 2) 빌드를 오랫동안 중단 상태로 유지 3) 경고를 오류로 해제하는 것과 같은 다른 솔루션입니다. 대부분의 경고는 오류로 표시되므로 경고 목록이 짧게 유지 될 수 있으므로 표시되는시기를 더 잘 알 수 있습니다. 선호하는 솔루션은 무엇입니까?
Neil

1
@mayu, 다른 팀 (동일 회사 내부이든 외부이든)은 클래스, 메서드, 기타 구성 요소가 일정 기간 동안 단계적으로 제거되고 있음을 합법적으로 전달하고자 할 수 있습니다. 속성을 추가하는 것은이를 라이브러리 소비자에게 알리는 좋은 방법입니다. 나는 이것을하는 것이 번거 롭다고 보지 않는다. 사실, 가능한 한 빨리 속성을 추가하는 것은 다른 사람들이 향후 변경 사항을 알 수 있도록하는 좋은 방법입니다.
Neil

1

경고를 오류로 취급하고 있습니다.

드물게 일부 허용 가능한 경고가 표시되면 (예 : 사용되지 않는 멤버 참조 또는 XML 직렬화 클래스에 대한 문서 누락), #pragma disable을 사용하여 명시 적으로 억제 해야합니다 (선택적으로 깨끗한 코드가없는 이유를 제공 할 수 있음). 주석으로).

이 지시문 있으면 질문이있을 때 누가이 경고 위반을 수락 했는지 (버전 제어의 "비난"조치에 의해) 알 수 있습니다.


3
내 설명에 언급 된 문제를 해결하지 못하더라도 이것을 사용합니다. 특정 경고를 숨기지 않고 경고로 처리하고 싶습니다.
Neil

0

단순히 "612, 1030, 1701 또는 1702가 아닌 다른 경고가있는 코드를 체크인하는 사람은 화이트 보드로 가서 '허용되지 않는 경고가있는 코드를 다시 체크인하지 않겠습니다. ' "


9
행운을 빕니다 ... 경고를 오류로 처리하는 것은 전반적인 코드 품질을 높이기위한 매우 중요한 단계 이며 개발자가 실제로 코드를 수정하도록 강요합니다! 모든 우박 자동화, 육체 노동은 너무나도 20 세기입니다!
Andreas Magnusson

@AndreasMagnusson 경우 경고의 부족은 실제로 .. 코드의 품질을 보장
user2864740

2
@ user2864740 : 동의합니다. 은색 총알이 없습니다. 그러나 그것이 은총 알이 아니라는 전제하에 유용한 것을 거부하는 것은 너무나 흔한 오류입니다.
Andreas Magnusson 2015


-4

나에게 근본적인 문제는 실제로 경고가 명확하지 않은 경우 오류를 오류로 취급하는 것과이를 위반하는 체크인을 허용하는 명백한 정책의 조합 인 것 같습니다. 말했듯이 경고에도 불구하고 계속 작업 할 수 있기를 원합니다. 무시하고 싶은 경고를 몇 가지만 언급했지만, 팀의 다른 누군가가 다른 유형의 경고를 유발하여 고치는 데 똑같이 오래 걸리는 경우 어떻게해야합니까? 그것도 무시하고 싶지 않습니까?

논리적 해결책은 1) 코드가 컴파일되지 않으면 체크인을 허용하지 않거나 (즉, 경고를 생성 한 사용자가 실제로 빌드를 중단했기 때문에이를 수정해야 함을 의미 함) 또는 2) 경고를 경고로 처리하는 것입니다. 두 개의 빌드 구성을 만듭니다. 하나는 경고를 오류로 처리하여 코드에 경고가 없는지 확인하기 위해 정기적으로 실행할 수 있고 다른 하나는 경고로만 처리하고 다른 사람이 경고를 도입 한 경우에도 작업 할 수 있도록합니다.


1
선택한 답변을 사용하면 경고로 취급되는 경고 목록에 쉽게 추가 할 수 있습니다. 제안 된 솔루션보다 훨씬 잘 작동합니다. 경고는 분명히 오류가 아니지만 대부분의 경고를 오류로 취급한다는 것은 코드가 해당 경고와 함께 체크인되지 않음을 의미합니다.
Neil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.