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?
Respuesta
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.
- Cambiar la versión de una DLL a la que se hace referencia se debe considerar un cambio de última hora.
- eliminar/cambiar miembros rompe la compatibilidad con versiones anteriores.
- añadiendo miembros se rompe la compatibilidad con versiones anteriores (algunas personas simplemente consideran "miembros agregados" como seguros, pero tiene un riesgo asociado).
- Cambie la versión del archivo con cada compilación, la necesitará en algún momento.
- 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.
- 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.
¿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
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
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.
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
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.
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.
- API Breaking Changes: Types
- API Breaking Changes: Methods
- API Breaking Changes: Fields
- API Breaking Changes: Interfaces and Abstract Classes
- Broken serializable types
- API: New publicly visible types
- API: New publicly visible methods
- API: New publicly visible fields
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):
- 1. Detecta cambios en la orientación usando javascript
- 2. ¿Detecta cambios de estado realizados en BluetoothAdapter?
- 3. Java detecta cambios en el sistema de archivos
- 4. Dependiendo de los cambios pendientes en TFS
- 5. TFS: comparar conjuntos de cambios
- 6. tfs: cómo desbloquear los cambios
- 7. Rotura de búfer de Tcp en .NET runtime
- 8. Git-Tfs: ¿Un conjunto de cambios TFS por Git Commit?
- 9. Generación de código usando .net
- 10. Detecta cambios de archivo en node.js a través de watchFile
- 11. TFS: etiquetas frente a conjuntos de cambios
- 12. Organizando el código fuente en TFS 2010
- 13. clojure REPL no detecta los cambios realizados en defrecord
- 14. Averigüe quién realizó cambios en VS 2010 con TFS
- 15. Cómo realizar el equivalente TFS de 'Deshacer cambios pendientes'
- 16. Cambios en el código Java en liquibase
- 17. Fusionando y dividiendo el código compartido entre proyectos en TFS
- 18. caso SQLDeveloper cambiar (formato de rotura)
- 19. Rotura en bucles for anidados
- 20. Obtenga todas las carpetas de TFS usando TFS SDK
- 21. cambios de ruptura en .NET 4.0
- 22. TFS Anotar detectar eliminación de código
- 23. Detecta imágenes 404 usando Javascript
- 24. Cómo hacer que la tabla no la rotura usando iTextSharp
- 25. Detecta FN-Key en Mac usando Javascript
- 26. TFS vs alternativas de código abierto?
- 27. Compilando el código .NET en .NET 4?
- 28. Cambios de XmlSerializer en .NET 3.5 SP1
- 29. ¿Cómo combinar los conjuntos de cambios TFS programáticamente?
- 30. Reglas para la compatibilidad con la clase C#/evitar cambios de rotura
A través de la revisión de código? – Mrchief
Pregunta relacionada: http://stackoverflow.com/questions/2377855/tool-for-backwards-compatibility-for-the-c-net-api – aponomarenko