2011-08-30 33 views
9

Me gustaría detectar cambios bruscos en el código .NET (específicamente C#) siempre que TFS cree una solución. Si hay algún cambio de rotura (como se describe en "A definite guide to API-breaking changes in .NET") entre el código que se está registrando y la versión en la compilación más reciente exitosa, me gustaría saberlo. Un cambio de ruptura no necesita hacer que la construcción falle. Si no se escribe una aplicación que usa la reflexión para comparar dos versiones del mismo conjunto, ¿cómo se puede hacer?¿Detecta cambios de rotura en el código .NET usando TFS?

+1

A través de la revisión de código? – Mrchief

+0

Pregunta relacionada: http://stackoverflow.com/questions/2377855/tool-for-backwards-compatibility-for-the-c-net-api – aponomarenko

Respuesta

3

Sí, usaría (y lo haré) NDepend para esto. Trabajo en un producto que proporciona una API extensible para desarrolladores. Como tal, debemos asegurarnos de que, entre lanzamientos, no eliminemos la funcionalidad de la que pueden depender esos desarrolladores. El otro lado, es que necesitamos la flexibilidad para hacer crecer el producto sin restricciones masivas en torno a la reversión.

Algunas cosas que querrás considerar.

  1. Cambiar la versión de una DLL a la que se hace referencia se debe considerar un cambio de última hora.
  2. eliminar/cambiar miembros rompe la compatibilidad con versiones anteriores.
  3. añadiendo miembros se rompe la compatibilidad con versiones anteriores (algunas personas simplemente consideran "miembros agregados" como seguros, pero tiene un riesgo asociado).
  4. Cambie la versión del archivo con cada compilación, la necesitará en algún momento.
  5. Considera escribir contratos que definan tu 'API pública'. Estos serán los miembros que necesita para apoyar fuera de la organización. Piense en ellos como límites de interoperabilidad. A continuación, permite que sus clases de implementación tengan miembros públicos, que no están en la API (por lo tanto, se consideran 'no compatibles'), por lo que puede cambiarlos sin preocuparse por romper la API de extensibilidad. La extensión de la API consiste en escribir una nueva interfaz (con un número de versión en el nombre de la interfaz) que NO deriva de la versión anterior de la interfaz (la derivación evita que desaprobe por completo a los miembros y crea un infierno cuando llega el momento de implementar múltiples versiones de interfaz en una sola clase.
  6. no se olvide acerca de los atributos, cambios en ellos no se pueden romper compatibilidad estática, sino que podría afectar el tiempo de ejecución.
+0

¿Elaborar en el n. ° 1? ¿Qué pasa si mi Apple.dll depende de v1 de Bear.dll, y actualizo a v1.2 de Bear.dll, y verifico que Bear.dll no expone ningún cambio de rotura según el otro # 2-6? Los usuarios de Apple.dll no deberían experimentar ninguna rotura como resultado correcto? Siempre que me asegure de que todos los dll referenciados también cumplen los mismos criterios en toda la cadena cada vez que actualizo una DLL referenciada, ¿no debería haber un problema correcto? – AaronLS

+0

Hola AaronLS. Esta es una buena pregunta, y debería haber elaborado originalmente en el # 1. El riesgo surge si la funcionalidad pública de Apple.dll 'devuelve tipos' que están declarados dentro de Bear.dll. Si estos ensamblajes están fuertemente tipados, entonces un producto que dependa de Apple esperará esa llamada de función para regresar (nombre de tipo completo) "Type, Bear, v1.1". Si ha "reparado en caliente" (cambiado pero no revertido) su Apple.dll, ahora devolverá "Type, Bear, v1.2" y el tiempo de ejecución arrojará una excepción de lanzamiento de clases, ya que los tipos fuertemente nombrados son calificados por todos nombre-componentes, incluida la versión. – Adam

3

Pruebas unitarias. Proporcionan una manera de afirmar 'esto es lo que espera el código del cliente'. Puedes have TFS run unit tests cuando construyes.

+3

Dos preocupaciones aquí (¡y soy un gran defensor de las pruebas unitarias!) primero es necesario tener una cobertura del 100%, impuesta por convención. El segundo es que a menos que las pruebas se mantengan fuera de la solución, cualquier refactor de corte también cambiaría las pruebas de la unidad, ignorando así el problema. – jalbert

2

Patrick Smacchia de NDepensa la fama publicada sobre este ~ hace 3.5 años.

http://codebetter.com/patricksmacchia/2008/01/20/avoid-api-breaking-changes/

Menciona LibCheck y (obviamente) NDepend, y un comentario menciones uno más.

Dado que han pasado más de 3,5 años desde entonces, es posible que haya mejores opciones disponibles en estos días (LibCheck tiene más de 6 años), pero deberían ser un comienzo.

5

Elaborar un poco en James y Adam respuestas, I' Me gustaría dar detalles sobre detectando el cambio de rotura s con NDepend y su consulta de código y capacidades de regla. Descargo de responsabilidad: soy uno de los desarrolladores de la herramienta

NDepend ha evolucionado y su lenguaje de consulta también.Si descarga la versión de prueba y análisis de NDepende las dos versiones de su base de código donde desea buscar el cambio de rotura, eche un vistazo al grupo de reglas de código predeterminado Cambios de última hora de la API para obtener el siguiente CQLinq rules.

La ejecución de uno de estos regla de código se ve como por ejemplo (esta entre NUnit v2.5.8 y V2.5.3):

API breaking changes

Cuestiones relacionadas