En base a mi experiencia con la gestión de dependencias de nivel de plataforma empresarial compleja y el control de versiones de versiones, he venido a recomendar un enfoque que me gusta llamar Control de versiones semántico .
Básicamente se basa en Semantic Versioning 2.0 pero no es tan estricto.
Segmentos de versión semántica:
<primary.release.segment>[-<pre.release.segment>][+<post.release.segment>]
Formato del segmento de lanzamiento primario:
MARKETTING.MAJOR.MINOR.PATCH
Cada segmento debe permitir alfanuméricos, pero se recomiendan números puros para los cambios incrementales lógicos.
Al igual que SemVer, recomiendo los componentes Major, Minor y Patch para representar niveles de compatibilidad inversa, pero también recomiendo anteponer un componente de Marketing . Esto permite a los propietarios de productos, las epopeyas / grupos de características y las inquietudes comerciales a superar el componente primario independientemente de las inquietudes de compatibilidad técnica.
A diferencia de otras respuestas, no recomendé agregar un número de compilación al segmento primario. En su lugar, agregue un segmento posterior al lanzamiento después de un '+' (por ejemplo: 1.1.0.0 + build.42). SemVer llama a esto metadatos de compilación, pero creo que el segmento posterior al lanzamiento es más claro. Este segmento es excelente para declarar los datos del sufijo como no relacionados con la información de compatibilidad en el segmento de lanzamiento primario. Sus compilaciones de integración continua pueden recibir el número de versión anterior junto con un número de compilación incremental que se restablece después de cada versión principal (por ejemplo: 1.1.0.0 -> 1.1.0.0 + build.1 -> 1.1.0.0 + build.2 -> 1.1.0.1). A algunas personas les gusta poner el número de revisión svn aquí o el git commit sha para facilitar el enlace al repositorio de código. Otra opción es usar el segmento posterior al lanzamiento para revisiones y parches, aunque puede valer la pena considerar agregar un nuevo componente de lanzamiento primario para eso. Siempre se puede descartar cuando se incrementa el componente del parche, ya que las versiones están efectivamente alineadas a la izquierda y ordenadas.
Además de los segmentos de lanzamiento y post-lanzamiento, las personas a menudo quieren usar un segmento de pre-lanzamiento para indicar pre-lanzamientos casi estables como alphas, betas y candidatos de lanzamiento. El enfoque de SemVer para esto funciona bien, pero recomiendo separar los componentes numéricos de los clasificadores alfanuméricos (por ejemplo: 1.2.0.0 + alpha.2 o 1.2.0.0 + RC.2). Normalmente, se toparía con el segmento de lanzamiento al mismo tiempo que se agrega el segmento posterior al lanzamiento y luego se soltaría el segmento de prelanzamiento la próxima vez que se tope con el segmento de lanzamiento primario (ej: 1.0.1.2 -> 1.2.0.0-RC.1 - > 1.2.0.0). Los segmentos de prelanzamiento se agregan para indicar que la versión de lanzamiento está llegando, generalmente solo un conjunto fijo de características para pruebas y compartimientos más profundos que no cambian minuto a minuto en función de más confirmaciones.
La belleza de tener todo esto definido semánticamente de una manera que cubre casi todos los casos de uso es que puede analizarlos, clasificarlos, compararlos e incrementarlos de manera estándar. Esto es especialmente importante cuando se utilizan sistemas CI para aplicaciones complejas con muchos componentes pequeños con versiones independientes (como microservicios), cada uno con sus propias dependencias administradas.
Si te interesa, escribí un analizador semántico semántico en rubí . No solo necesitaba usar este patrón, sino también poder administrar otras aplicaciones que lo usaban.