"Trate todos os avisos como erros, exceto ..." no Visual Studio

124

No Visual Studio, posso selecionar a opção "Tratar avisos como erros" para impedir que meu código seja compilado se houver algum aviso. Nossa equipe usa essa opção, mas há dois avisos que gostaríamos de manter como avisos.

Existe uma opção para suprimir avisos, mas queremos que eles apareçam como avisos, para que não funcionem.

Parece que a única maneira de obter o comportamento que queremos é inserir uma lista de todos os números de aviso de C # na caixa de texto "Avisos específicos", exceto os dois que queremos que sejam tratados como avisos.

Além da dor de cabeça na manutenção, a maior desvantagem dessa abordagem é que alguns avisos não possuem números e, portanto, não podem ser referenciados explicitamente. Por exemplo, "Não foi possível resolver esta referência. Não foi possível localizar o conjunto 'Dados ....'"

Alguém sabe de uma maneira melhor de fazer isso?


Esclarecendo para quem não vê imediatamente por que isso é útil. Pense em como a maioria dos avisos funciona. Eles dizem que algo está um pouco errado no código que você acabou de escrever. Demora cerca de 10 segundos para corrigi-los, e isso mantém a base de código mais limpa.

O aviso "Obsoleto" é muito diferente disso. Às vezes, corrigi-lo significa apenas consumir uma nova assinatura de método. Mas se uma classe inteira é obsoleta e você pode usá-la espalhada por centenas de milhares de linhas de código, pode levar semanas ou mais para corrigir. Você não quer que a compilação seja quebrada por tanto tempo, mas definitivamente deseja receber um aviso sobre isso. Este não é apenas um caso hipotético - isso aconteceu conosco.

Os avisos literais de "#warning" também são exclusivos. Muitas vezes, quero fazer check-in, mas não quero interromper a compilação.

Neil
fonte
Você pode colocar espaços em sua grande lista de números? Ele encheu a quebra de linha.
Ray
Gawd Eu odeio regras complicadas que são criadas por pessoas, muitas vezes para acalmar o ego de uma pessoa específica.
Jon Limjap
21
Entendo o argumento dele sobre o aviso obsoleto, isso não é arbitrário.
Ed S.
Na minha experiência, permitir que apenas um aviso em sua compilação seja como adicionar um primeiro async / waitit. Em breve haverá dezenas deles. Em todas as configurações, lembro que um desenvolvedor pode ver menos de 10 avisos na janela Lista de Erros no VS. Eu posso apostar que, tão logo você tenha mais de 5 avisos, a grande maioria dos desenvolvedores de uma equipe não conseguirá encontrar um novo - na sua configuração, isso significa que eles não detectarão o aviso de que o método é obsoleto, o que desafia todo o propósito de ter um aviso :) Qual é a sua experiência com esse Neil?
usar o seguinte comando
@ mayu, é um enigma. Muitas vezes, vi avisos ignorados por um longo tempo. Mas, no final, você mostra o aviso ou não mostra nada. Se você estiver mostrando o aviso, pelo menos há uma chance de alguém aprender algo útil com ele. Se você tratar a maioria dos avisos como erros, os poucos remanescentes poderão receber mais atenção.
213 Neil

Respostas:

155

Você pode adicionar uma WarningsNotAsErrorsetiqueta no arquivo do projeto.

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

Nota: 612e 618são ambos avisos sobre Obsoleto, não sei a diferença, mas o projeto no qual estou trabalhando está relatando Obsoleto com o aviso 618.

SvenL
fonte
24
A diferença entre 612 e 618 é o comentário do ObsoleteAttribute. Um ObsoleteAttribute sem comentário gera o erro 612 e um com um comentário gera 618.
Marco Spatz 30/03
@MarcoSpatz Exatamente. Em seguida, podemos tratar os [Obsolete]membros onde messageestão nullcomo erros, enquanto deixamos que aqueles onde messageestão definidos permaneçam apenas avisos. Se o errorparâmetro for definido como trueno ObsoleteAttribute, um CS0619 é gerado em vez disso. Isso parece não funcionar se messageestiver null(mas quem faria de [Obsolete(null, true)]qualquer maneira?).
Jeppe Stig Nielsen
Para F #, use --warnaserror-:618,1030no campo Build-> Other flags. Esta opção de projeto ainda não foi implementada para projetos de F #. github.com/Microsoft/visualfsharp/issues/3395
Asik
2
É bom saber que "WarningsNotAsErrors" existe. Ele deve estar disponível nas configurações do projeto sem editar manualmente o arquivo. Obrigado.
#
1
A Microsoft realmente estragou tudo (e 11 anos depois, não consertou as coisas!). As configurações do projeto são alteradas <NoWarn>, o que é inferior na maioria dos casos e não foi possível inserir <WarningsNotAsErrors>a interface do usuário. Parabéns.
User2864740 12/02
13

/ warnaserror / warnaserror-: 618


fonte
1
Obrigdo por sua contribuição. Mesmo que eles não resolvam o problema do IDE, esses são os comentários mais úteis até agora.
294 Neil
2
Onde você adiciona isso?
Chec #
@checho, essas opções seriam adicionadas na linha de comando ao chamar o msbuild. Para nossos propósitos, a resposta principal é mais útil, porque podemos inseri-la no projeto em vez de modificar a forma como chamamos msbuild.
Neil
Não funciona com o MSBuild 15.9.21 + g9802d43bc3: MSBUILD : error MSB1001: Unknown switch. Switch: /warnaserror-:618
Paul B.
3

ou, mais especificamente, no seu caso:

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

isso deve tratar todos os avisos como erros, exceto os da lista separada por vírgula


fonte
1

Por que você deseja continuar vendo avisos de que não está tratando como erros? Estou confuso sobre por que isso é desejável - ou você os corrige ou não.

Dois arquivos diferentes de construção / solução funcionariam - ou um script para copiar um e, então, modificar o nível de avisos / avisos seria adequado. Parece que talvez você queira que algumas execuções do compilador gritem, mas outras que você deseja continuar.

Portanto, diferentes opções de compilador parecem um bom caminho a percorrer. Você pode fazer isso com diferentes destinos - um rotulado como debug ou release e os outros rotulados adequadamente sobre os avisos.

Tim
fonte
7
A maioria dos avisos acontece devido a uma simples confusão no meu código (por exemplo, declarei uma variável que não uso). Um aviso obsoleto geralmente acontece devido a uma alteração no código de outra pessoa. Corrigir isso pode levar semanas de desenvolvimento. #warning é um aviso que eu quero no código (provavelmente uma correção a longo prazo).
611 Neil
4
Em outras palavras, há avisos de que não quero interromper minha compilação. Se #warning interromper a compilação, nunca poderei fazer check-in. Se Obsolete interromper a compilação, outra equipe da qual dependemos poderá, sem saber, interromper a compilação da nossa equipe apenas adicionando um atributo obsoleto.
Neil
@ Neil Eu concordo com alguns de seus argumentos, mas remover uma var que você não usa não leva muito tempo E você definitivamente quer saber que outra equipe tornou algo obsoleto.
tymtam
@ mayu, obrigado pelo seu comentário. Concordo com um var que você não usa. É por isso que eu gostaria que o compilador o tratasse como um erro. Também concordo que você quer saber quando algo está obsoleto. Mas, se levar um tempo proibitivo para refatorar algo obsoleto do nosso código, suas escolhas serão: 1) Trate esse aviso como um aviso 2) Deixe sua compilação ficar interrompida por um longo tempo 3) Alguma outra solução, como desativar avisos como erros. Com a maioria dos avisos como erros, é provável que sua lista de avisos permaneça curta, portanto é mais provável que você observe quando eles aparecerem. Qual é a sua solução preferida?
Neil
1
@ mayu, outra equipe (seja dentro da mesma empresa ou fora dela) pode legitimamente querer comunicar que uma classe, método ou outro componente está sendo eliminado gradualmente por algum período de tempo. A adição de um atributo é uma boa maneira de sinalizar isso para os consumidores de uma biblioteca. Eu não vejo isso como problemático para fazer isso. De fato, adicionar o atributo o mais cedo possível é uma boa maneira de garantir que outras pessoas estejam cientes das mudanças futuras.
Neil
1

Estou usando tratar avisos como erros.

Em casos raros, quando algum aviso aceitável aparece (por exemplo, referenciando membro obsoleto ou documentação ausente nas classes de serialização XML), ele deve ser explicitamente suprimido com a desativação #pragma (e, opcionalmente, pode ser fornecido o motivo para não ter um código limpo como um comentário).

A presença desta diretiva também permite descobrir quem aceitou esta violação de aviso (por ação "culpada" do controle de versão), caso haja algumas perguntas.

Rinat Abdullin
fonte
3
Eu também uso isso, embora não resolva os problemas mencionados na minha descrição. Quero que certos avisos sejam tratados como avisos, não ocultos.
Neil
0

Por que simplesmente não ter uma regra dizendo "Quem quer que verifique o código com qualquer aviso que não seja 612, 1030, 1701 ou 1702 nele deve ir para o quadro branco e escrever centenas de vezes 'Não irei verificar o código com avisos não permitidos novamente. '"

erikkallen
fonte
9
Boa sorte ao impor isso ... Tratar avisos como erros é uma etapa muito importante para aumentar a qualidade geral do código e forçará os desenvolvedores a corrigir seu código! Toda automação de granizo, trabalho manual é tão do século 20: ish!
Andreas Magnusson
@AndreasMagnusson Se apenas a falta de advertências realmente assegurada a qualidade do código ..
user2864740
2
@ user2864740: Concordado, não há balas de prata. Mas é uma falácia muito comum rejeitar algo útil na premissa de que não é uma bala de prata.
Andreas Magnusson
-4

Parece-me que o problema principal é realmente uma combinação de tratar os avisos como erros, quando claramente não o são, e sua aparente política de permitir check-ins que violam isso. Como você diz, deseja continuar trabalhando apesar de um aviso. Você mencionou apenas alguns avisos que deseja poder ignorar, mas e se alguém da equipe causasse outro tipo de aviso, o que levaria um tempo igualmente para ser corrigido? Você não gostaria de poder ignorar isso também?

A solução lógica seria 1) Não permitir check-ins se o código não compilar (o que significa que aqueles que criaram os avisos precisarão corrigi-los, pois, na verdade, eles quebraram a compilação) ou 2) tratam os avisos como avisos. Crie duas configurações de compilação, uma que trate avisos como erros, que podem ser executados regularmente para garantir que o código esteja livre de aviso e outra que trate apenas como avisos e permita que você trabalhe mesmo que alguém introduza um aviso.

jalf
fonte
1
Usando a resposta selecionada, é fácil adicionar à lista de avisos tratados como avisos. Isso funciona muito melhor do que qualquer uma das soluções propostas. Os avisos claramente não são erros, mas tratar a maioria dos avisos como erros significa que o código nunca será verificado com esses avisos.
Neil