2008-11-05 55 views
101

En Visual Studio, puedo seleccionar la opción "Tratar advertencias como errores" para evitar que mi código se compile si hay advertencias. Nuestro equipo usa esta opción, pero hay dos advertencias que nos gustaría mantener como advertencias."Tratar todas las advertencias como errores, excepto ..." en Visual Studio

Hay una opción para suprimir las advertencias, pero QUEREMOS que aparezcan como advertencias, por lo que no funcionará.

Parece que la única manera de obtener el comportamiento que queremos es ingresar una lista de cada número de advertencia C# en el cuadro de texto "Advertencias específicas", excepto los dos que queremos tratar como advertencias.

Además del dolor de cabeza de mantenimiento, la mayor desventaja de este enfoque es que algunas advertencias no tienen números, por lo que no se pueden hacer referencia explícita. Por ejemplo, "No se pudo resolver esta referencia. No se pudo encontrar el conjunto 'Datos ....'"

¿Alguien sabe de una mejor manera de hacerlo?


Aclarando a aquellos que no ven de inmediato por qué es útil. Piensa en cómo funcionan la mayoría de las advertencias. Te dicen que algo está un poco apagado en el código que acabas de escribir. Se necesitan unos 10 segundos para repararlos, y eso mantiene la base de código más limpia.

La advertencia "Obsoleto" es muy diferente a esta. A veces arreglarlo significa simplemente consumir una nueva firma de método. Pero si una clase entera está obsoleta y tiene un uso disperso a través de cientos de miles de líneas de código, podría llevar semanas o más arreglarla. No quiere que la construcción se rompa por tanto tiempo, pero definitivamente QUIERE ver una advertencia al respecto. Esto no es solo un caso hipotético: esto nos ha sucedido a nosotros.

Las advertencias "advertencias" literales también son únicas. A menudo quiero para registrarlo, pero no quiero romper la compilación.

+0

¿Puede poner espacios en su gran lista de números? Se ha llenado la línea de envoltura. – Ray

+0

Gawd Odio las reglas complicadas que están hechas por personas, a menudo para calmar el ego de una persona específica. –

+18

Veo su punto acerca de la advertencia obsoleta, esto no es arbitrario. –

Respuesta

131

Puede agregar un WarningsNotAsErrors -tag en el archivo de proyecto.

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

Nota: 612 y 618 son dos advertencias sobre obsoleto, no sé la diferencia, pero el proyecto que estoy trabajando en está informando obsoleto con la advertencia 618.

+18

La diferencia entre 612 y 618 es el comentario de ObsoleteAttribute. Un atributo Obsolete sin comentario genera el error 612, y uno con un comentario genera 618. –

+0

@MarcoSpatz Exactamente. Entonces podemos tratar a los miembros '[Obsoletos]' donde el 'mensaje' es' nulo' como errores, mientras que aquellos en los que el 'mensaje' está establecido solo son advertencias. Si el parámetro 'error' se establece en' true' en 'ObsoleteAttribute', en su lugar se genera un CS0619. Esto parece no funcionar si 'message' es' null' (¿pero quién haría '[Obsolete (null, true)]' de todos modos?). –

1

¿Por qué quiere seguir viendo advertencias de que no está tratando como errores? Estoy confundido acerca de por qué es deseable, ya sea que los arregles o no.

¿Funcionarían dos archivos de compilación/solución diferentes, o una secuencia de comandos para copiar uno y luego modificar el nivel de advertencia/advertencia adecuado? Parece que tal vez quieras algunas ejecuciones del compilador para graznar, pero otras quieres continuar.

Por lo tanto, los diferentes modificadores de compilación parecen una buena forma de hacerlo. Podría hacer esto con diferentes objetivos: uno etiquetado como depurar o liberar y los otros etiquetados de forma adecuada acerca de las advertencias.

+6

La mayoría de las advertencias se producen debido a una simple confusión en mi código (por ejemplo, he declarado una variable que no uso). Una advertencia obsoleta a menudo sucede debido a un cambio en el código de otra persona. Reparar esto podría llevar semanas de desarrollo. # advertencia es una advertencia que quiero en el código (probablemente una solución a largo plazo). –

+3

En otras palabras, hay advertencias de que no quiero romper mi compilación.Si #warning rompe la compilación, entonces nunca podré verificarla. Si Obsolete rompe la compilación, entonces otro equipo del que dependemos podría romper la compilación de nuestro equipo sin saberlo simplemente agregando un atributo obsoleto. –

+0

@Neil Estoy de acuerdo con algunos de tus argumentos, pero eliminar una var que no usas no lleva mucho tiempo * Y * definitivamente quieres saber que otro equipo dejó algo obsoleto. – mayu

-3

Me parece que el problema de raíz es realmente una combinación de sus advertencias de tratamiento como errores, cuando claramente no lo son, y su aparente política de permitir registros que violan esto. Como dices, quieres poder seguir trabajando a pesar de una advertencia. Solo mencionó algunas advertencias que desea ignorar, pero ¿qué pasa si alguien más en el equipo causa otro tipo de advertencia, que le tomaría la misma cantidad de tiempo corregir? ¿No te gustaría poder ignorar eso también?

La solución lógica sería 1) No permitir registros si el código no se compila (lo que significa que los que crearon las advertencias tendrán que corregirlos, ya que en efecto, rompieron la construcción), o 2) tratar advertencias como advertencias Cree dos configuraciones de compilación, una que trate las advertencias como errores, que se pueden ejecutar regularmente para garantizar que el código sea libre de advertencias, y otra, que solo las trate como advertencias, y le permita trabajar incluso si alguien más introdujo una advertencia.

+1

Usando la respuesta seleccionada, es fácil de agregar a la lista de advertencias tratadas como advertencias. Eso funciona mucho mejor que cualquiera de sus soluciones propuestas. Las advertencias claramente no son errores, pero tratar la mayoría de las advertencias como errores significa que el código nunca se controlará con esas advertencias. –

11

/warnaserror/warnaserror-: 618

+1

Gracias por su contribución. A pesar de que no resuelven el problema IDE, estos son los comentarios más útiles hasta el momento. –

+2

¿Dónde agregas esto? – checho

+0

@checho, esos modificadores se agregarían en la línea de comando al llamar a msbuild. Para nuestros propósitos, la respuesta principal es más útil, porque podemos incluirla en el proyecto en lugar de tener que modificar la forma en que llamamos a msbuild. –

3

o más específicamente, en su caso:

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

este debe tratar todas las advertencias como errores a excepción de los que están en su lista separada por comas

1

estoy usando tratan como advertencias errores

En una rara casos, cuando alguna advertencia aceptable se muestra (es decir, referencia miembro obsoleto, o documentación sobre las clases de serialización XML que falta), entonces tiene que ser explícitamente suprimida con #pragma desactivar (y la razón opcionalmente por no tener un código limpio podría proporcionarse como un comentario a lo largo).

La presencia de esta directiva también permite averiguar, que aceptó esta violación de advertencia (por acción de "culpa" de control de versión) en caso de que haya algunas preguntas.

+2

Utilizo esto también, aunque no resuelve los problemas mencionados en mi descripción. Quiero ciertas advertencias tratadas como advertencias, no ocultas. –

-1

¿Por qué no simplemente tener una regla que dice "Quien revise el código con cualquier advertencia dentro de él que no sea 612, 1030, 1701 o 1702 debe ir a la pizarra y escribir cien veces" No verificaré el código con advertencias prohibidas de nuevo. '"

+9

Buena suerte para aplicar eso ... ¡Tratar las advertencias como errores es un paso muy importante para aumentar la calidad general del código * y * obligará a los desarrolladores a reparar realmente su código! Toda la automatización del granizo, el trabajo manual es * tan * del siglo 20: ish! –

+0

@AndreasMagnusson Si solo la falta de advertencias realmente garantizara la calidad del código ... – user2864740

+1

@ user2864740: De acuerdo, no hay balas de plata. Pero es una falacia demasiado común rechazar algo útil sobre la premisa de que no es una panacea. –

Cuestiones relacionadas