Pregunta

Estoy buscando punteros, sugerencias, e incluso el dictado en la forma de gestionar los tres números de versión de montaje diferentes para un ensamblaje .NET. La versión del producto es el más sencillo, ya que parece que normalmente se dicta negocio. A continuación, la versión del archivo parece ser de versiones entre los despliegues, donde la versión montaje real sólo se utiliza cuando el envío.

En este momento estoy sólo en busca de un medio simple de etiquetado versiones de prueba y mantenimiento de una asamblea en la que ninguno dependen, por lo que estoy mirando incremento automático de construcción y los números de revisión de la versión del archivo y de la liberación final, la copia de la versión del archivo actual a la versión de ensamblado. El producto está en uso en producción, pero aún en fase de desarrollo - ya sabes -. Uno de los pequeña empresa, no hay situaciones de infraestructura de control de cambios

¿Fue útil?

Solución

versiones es algo que soy muy apasionado y he pasado mucho tiempo tratando de llegar a un fácil utilizar el sistema de control de versiones. A partir de lo que ya ha dicho en su pregunta, está claro que usted ha comprendido un punto importante, los números de versión de montaje no son sinónimos de la versión del producto. Uno es conducido técnicamente, y el otro es impulsado por el negocio.

El siguiente supone que se utiliza alguna forma de control de origen y un servidor de compilación. Para el contexto utilizamos TeamCity y Subversion / Git. TeamCity es libre para un pequeño número (10) de los proyectos y es un muy buen servidor de compilación, pero hay otros, algunos de los cuales son completamente gratuitos.

¿Qué significa un número de versión

¿Qué versión de un medio para una persona puede significar algo diferente a otro, la estructura general es mayor, menor, macro, micro. La manera en que veo un número de versión es dividirlo en dos partes. La primera mitad se describe la versión principal (mayor) y las actualizaciones clave (menor). La segunda mitad indica cuando fue construido y lo que era la versión del código fuente. Los números de versión también cosas malas diferentes dependiendo del contexto, es una API, de aplicación web, etc.

Major.Minor.Build.Revision

  • Revision Este es el número tomada de control de fuente para identificar qué en realidad fue construida.
  • Build Se trata de un número cada vez mayor de que se puede utilizar para encontrar una basarse especialmente en la construcción de servidor. Es un número importante debido a que la servidor de compilación puede haber construido la misma fuente dos veces con un conjunto diferente de parámetros. Utilizando el número de compilación de junto con el número de la fuente Le permite identificar lo que fue construido y cómo.
  • Minor Esto sólo debería cambiar cuando hay un cambio significativo en la interfaz pública. Por ejemplo, si se trata de una API, código haría consumir seguir siendo capaz de compilar? Este número debe ser puesto a cero cuando el número mayor de cambios.
  • Major indica qué versión de la producto que se encuentra. Por ejemplo, la Mayor de toda la VisualStudio 2008 asambleas es de 9 y VisualStudio 2010 es 10.

La excepción a la regla

Siempre hay excepciones a la regla y que tendrá que adaptarse a medida que se llega a través de ellos. Mi enfoque original se basó en el uso de la subversión, pero recientemente me he mudado a Git. control de código fuente como la subversión y la fuente segura de que utilice un repositorio central tiene un número que puede ser utilizada para identificar un conjunto particular de las fuentes de un momento dado. Este no es el caso para un control de fuente distribuido como Git. Debido a Git utiliza repositorios distribuidos que están en cada equipo de desarrollo no hay auto incrementar el número que se puede utilizar, hay un truco que utiliza el número de registros de entrada pero es feo. Debido a esto he tenido que evolucionar mi enfoque.

Major.Minor.Macro.Build

El número de revisión se ha ido ahora, se ha desplazado a la acumulación cuando la revisión solía ser y se ha insertado Macro. Puede utilizar la macro cómo mejor le parezca, pero la mayoría de las veces me deja solo. Debido a que usamos TeamCity la información perdida por el número de revisión se puede encontrar en la construcción, que significa que hay un proceso de dos pasos, pero no hemos perdido nada y es un compromiso aceptable.

¿Qué ajustar

Lo primero que hay que entender es que la versión de ensamblado, la versión del archivo y versión del producto no tiene por qué coincidir. No estoy abogando por tener diferentes conjuntos de números, sino que hace la vida mucho más fácil al hacer pequeños cambios en una asamblea que no afecte a ninguno interfaces públicas que no se ven obligados a volver a compilar ensamblados dependientes. El acuerdo forma en que con esto es sólo para establecer los números mayor y menor en la Asamblea Version pero para ajustar todos los valores de la versión del archivo. Por ejemplo:

  • 1.2.0.0 (AssemblyVersion)
  • 1.2.3.4 (FileVersion)

Esto le da la capacidad de rodar a cabo las correcciones urgentes, que no rompa el código existente porque las versiones de montaje no coinciden, pero permitirá ver la revisión / construcción de un montaje mirando su número de versión del archivo. Se trata de un enfoque común y se puede ver en algunos conjuntos de código abierto cuando nos fijamos en los detalles de montaje.

como el plomo del equipo tendría que ser responsable de incrementar el número menor, cuando cada vez se requiere un cambio importante. Una solución para el despliegue de un cambio necesario para una interfaz, pero no romper el código anterior es marcar el actual como obsoletas y la creación de una nueva interfaz. Esto significa que el código existente se advirtió que el método es obsoleto y puede ser retirado en cualquier momento, pero no le requiere para romper todo inmediatamente. A continuación, puede eliminar el método obsoleto cuando todo se ha migrado.

¿Cómo conectar juntos

Se puede hacer todo lo anterior de forma manual, pero sería mucho tiempo, lo que sigue es la forma en que se automatizan el proceso. Cada paso es ejecutable.

  • AssemblyVersion y AssemblyFileVersion atributos de todo el proyecto AssemblyInfo archivos .cs.
  • Crear un archivo de información de montaje común (llámese VersionInfo.cs) y añadirlo como un elemento vinculado a todos sus proyectos.
  • Añadir atributos AssemblyVersion y AssemblyFileVersion a la versión con valores de "0.0.0.0".
  • Crear un proyecto MSBUILD que construye el archivo de solución.
  • Añadir en una tarea antes de la compilación que actualiza los VersionInfo.cs. Hay una serie de bibliotecas MSBUILD de código abierto que incluyen una tarea AssemblyInfo que puede establecer el número de versión. Sólo tienes que configurar a un número arbitrario y prueba.
  • Añadir un grupo de propiedades que contiene una propiedad para cada uno de los segmentos del número de compilación. Aquí es donde se establece el mayor y menor. El número de compilación y revisión se debe pasar como argumentos.

Con la subversión:

<PropertyGroup>
    <Version-Major>0</Version-Major>
    <Version-Minor>0</Version-Minor>
    <Version-Build Condition=" '$(build_number)' == '' ">0</Version-Build>
    <Version-Build Condition=" '$(build_number)' != '' ">$(build_number)</Version-Build>
    <Version-Revision Condition=" '$(revision_number)' == '' ">0</Version-Revision>
    <Version-Revision Condition=" '$(revision_number)' != '' ">$(revision_number)</Version-Revision>
</PropertyGroup>

Espero haber sido claro, pero hay mucho en juego. Por favor cualquier pregunta. Voy a utilizar cualquier comentario que poner una entrada en el blog más concisa juntos.

Otros consejos

El [AssemblyVersion] es un negocio muy grande en .NET. Una filosofía, animado por Microsoft es que se lo permites incremento automático, obligando a todos proyectos que dependen de la asamblea que volver a compilar. Obras okayish si utiliza un servidor de compilación. Nunca es el mal que hay que hacer, pero ten cuidado de las personas que llevan espadas.

El otro, más estrechamente asociada con su significado real es que el número es representativo para el control de versiones de la interfaz pública del conjunto. En otras palabras, sólo cambia cuando se altera una interfaz pública o clase. Dado que sólo como un cambio requiere que los clientes de la asamblea que volver a compilar. Esto tiene que hacerse de forma manual, sin embargo, el sistema de construcción no es lo suficientemente inteligente como para detectar automáticamente un cambio de este tipo.

Se puede ampliar aún más este enfoque sólo incrementando la versión cuando el montaje se desplegó en las máquinas fuera de su alcance. Este es el enfoque que utiliza Microsoft, sus números de versión NET muy rara vez cambian. Sobre todo a causa del dolor considerable que provoca en sus clientes.

Entonces, ¿qué Microsoft predica no es lo que las prácticas. Su proceso de creación y control de versiones es sin embargo sin igual, incluso tienen un ingeniero de software dedicado que supervisa el proceso. no funcionó tan bien, la WaitHandle.WaitOne (int) Sobrecarga en particular, causado una buena cantidad de dolor . Fija en .NET 4.0 con un enfoque muy diferente, pero que se está poniendo un poco más allá del alcance.

Se trata más bien de usted y de su confianza en lo bien que se puede controlar el proceso de construcción y los ciclos de lanzamiento para hacer su propia elección. Aparte de eso, el incremento automático [AssemblyFileVersion] automáticamente es muy apropiado. Sin embargo, con los inconvenientes que esto es no compatible.

Se puede usar la parte de construcción del número de versión de incremento automático.

[assembly: AssemblyVersion("1.0.*")]

En el entorno de una versión de prueba es una versión que tiene una versión de compilación! = 0. En caso de liberación incrementas la parte menor y configurar la parte de construcción a 0, así es como se identificaría asambleas liberados.

Si instala los ensamblados en la GAC ??GAC su se inunda con una gran cantidad de versiones diffent lo largo del tiempo, así que tenlo en cuenta. Sin embargo, si utiliza los archivos DLL sólo a nivel local, creo que esto es una práctica buena.

Adición a Bronumskis respuesta , quiero señalar que después de la norma Semántica de versiones 2.0 a semver.org , Major.Minor.Build.Revision sería ilegal debido a la regla de que después de aumentar un número, todos los valores regulares a la derecha tendría que ser puesto a cero .

Una mejor manera siguiendo el estándar sería el uso de Major.Minor+Build.Revision. Esto no es obivously para su uso en AssemblyVersionAttribute, sino un atributo personalizado o clase estática podría ser utilizado en su lugar.

Semver en TeamCity debe estar disponible utilizando el Meta-corredor Power Pack. Para git con git-flow (especialmente en el mundo .NET), encontré GitVersion para ser útil.

No hay ninguna regla dura y rápida cuando se trata de montajes de versiones, por lo que no dude en probar lo que jamás podría funcionar para usted, pero yo sugeriría que haga uso de 4 partes acercarse ya que tendrá la FLEXIBILIDAD en caso que usted desee hacer algunos cambios en el futuro.

... por ejemplo:. 1.0.0 *

Reservados - Esto añade FLEXIBILIDAD adicional, en caso que usted quiere hacer cualquier cambio en el futuro. Sino como un defecto, que sea como 0.

Además, considere la firma del ensamblaje con llave fuerte. Esto va a resolver el problema de conflicto de montaje en caso que usted tiene múltiples versiones de reunión registrada en el GAC. MSDN Enlace

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top