2009-09-21 8 views
23

Digamos que un equipo de programadores está haciendo una aplicación web en Perl y usa git para alojar su código. Ahora tienen un pequeño problema con versiones de sus módulos:

  • Perl::Critic y PBP tanto recomendar un $VERSION variables respaldado por RCS en el código
  • git recomienda explícitamente contra utilizar números de revisión reemplazables en el código (con buena razón)

Entiendo por qué git no hace expansión de palabra clave. Sin embargo, puedo entender perfectamente la necesidad de que los números de revisión para un poco de código:

  • Usted hacer necesitan un control de versiones por separado para cada módulo, ya que puede que desee utilizar versionado use
  • Probablemente Don 't quieren cambiar los números de versión para el módulo manualmente

Una versión global de productos para el envasado y la prueba se puede implementar fácilmente con las etiquetas y git describe que cambia rápidamente, pero todavía no ven una forma de introducir versiones automáticas para módulos individuales.

¿Tiene alguna solución para mí?

+0

Esta es una buena pregunta. Pero, ¿realmente recomiendan Perl :: Critic y/o PBP los números de versión respaldados por RCS? AFAI, realmente no les importa de dónde vienen esos números. – innaM

+1

@Manni: sí, no les importa, pero aún recomiendan RCS como la "mejor práctica": "Una práctica común es usar la palabra clave $ Revision: 3629 $ para definir automáticamente la variable $ VERSION de esta manera: nuestra ($ VERSIÓN) = '$ Revisión: 3629 $' = ~ m {\ $ Revisión: \ s + (\ S +)} x; " –

+0

Simpatizo porque actualmente estoy exactamente en la misma situación. Supongo que con cada vez más proyectos que usan git, la práctica será cada vez menos común. – innaM

Respuesta

20

Olvídate de lo que dice Perl Best Practices. No es la Biblia, y simplemente sugiere usar palabras clave de RCS porque en el momento en que se escribió nadie estaba pensando en otros sistemas de control de origen. Su objetivo nunca debe ser el cumplimiento con la implementación particular de PBP, pero adaptando las ideas en PBP a su propia situación. Recuerde leer el primer capítulo de ese libro.

En primer lugar, vamos a arreglar sus supuestos:

  1. usted no necesita una versión separada para cada módulo en una distribución. Solo necesita dar a cada archivo de módulo una versión que sea diferente a la de las distribuciones anteriores. Todos los módulos en la distribución pueden tener la misma versión, y cuando lo hacen, todos pueden ser mayores que la versión de la última distribución.

  2. ¿Por qué no cambiar manualmente las versiones de un módulo que cambia rápidamente?Debes tener puntos definidos donde tu código se convierta en algo que las personas puedan usar. En esos puntos, hace algo para decir que ha tomado la decisión de distribuir el producto de su trabajo, ya sea como prueba o como versión estable. Cambia las versiones como una forma de decirle a las personas algo sobre su desarrollo. Cuando dejas que el sistema de control de origen lo haga simplemente porque te comprometes, estás perdiendo la oportunidad de denotar ciclos en tu desarrollo. Por ejemplo, normalmente utilizo dos publicaciones menores de lugar. Eso significa que recibo 100 lanzamientos antes de que el interrogatorio salga de wack y necesito encontrar la versión principal para restaurar un orden de clasificación adecuado. No es suficiente espacio de versión si dejo que el VCS maneje esto para mí.

Solía ​​usar palabras clave RCS para enlazar las versiones de mis módulos para su registro o número de revisión, pero realmente no le gusta eso. Realizo muchas confirmaciones a un archivo antes de que esté listo para ser la próxima versión, y no necesito el cambio $VERSION simplemente porque solucioné un error tipográfico en la documentación. Habría grandes saltos en los números de versión porque había hecho muchos pequeños cambios.

Ahora solo cambio las versiones de todos mis archivos de módulo cuando estoy listo para lanzar una nueva distribución. Yo uso el ppi_version para cambiar todas las versiones a la vez:

ppi_version change 1.23 1.24 

Todos mis archivos de módulo sale el mismo $VERSION. No necesito usar $VERSION para distinguirlos porque utilizo las funciones normales de control de fuente para hacer eso. No necesito $VERSION para vincularlo a una confirmación específica.

Si estoy trabajando para una nueva distribución desde la versión 1.23, empiezo a hacer las versiones de desarrollo 1.23_01, 1.23_02, y así sucesivamente, pero solo cuando estoy listo para que la gente pruebe esas versiones. Cambio la versión al comienzo del ciclo, no al final. Todos mis compromisos previos a la próxima versión ya tienen su próxima versión. También tomo notas sobre lo que quiero que ese ciclo logre.

Cuando creo que es el comienzo de un nuevo ciclo, toco la versión de nuevo. Cuando creo que tengo una versión estable, cambio el desarrollo $VERSION a uno estable, como 1.23_04 a 1.24. Cada vez que lanzo algo, también lo etiqueto en control de fuente. Puedo ver que mis principales puntos de desarrollo se alinean con el control de fuente con bastante facilidad.

Todo es mucho más fácil para mí. Nada está ligado al control de fuente que decido usar, así que no tengo que volver a hacer todo si cambio lo que uso.

+1

Solo para aclarar: en mi equipo soy principalmente el que llora "¡F ** k PBP!" ;-) Prefiero averiguar si existe un método mejor de lo que planeo hacer. ppi_version es solo uno de esos consejos que esperaba, ¡muchas gracias! –

+0

¡Gracias por el consejo sobre ppi_version! http://search.cpan.org/dist/PPI-PowerToys/lib/PPI/PowerToys.pm –

3

Me gustaría ir a versiones de golpear manualmente al introducir cambios incompatibles, porque, ciertamente, no todos los cambios justifican el bache.

También es posible que quieres descargar el 'gitattributes' página de manual para el atributo filter - tal vez va a querer introducir su propio filtro para hacer las sustituciones en base a 'git describe' de salida de forma automática.

+1

¿Está seguro de que un filtro podría ayudar en ese caso? git no tiene nada como los números de revisión. Entonces, ¿qué haría un filtro cuando le dices que inserte un número de versión en alguna parte? – innaM

+2

Manni, el filtro implementaría el control de versiones basado en etiquetas y la salida 'git describe'. –

+2

Básicamente, salida 'git describe', que es agradable cuando se basa en etiquetas. –

0

¿Qué tal algo muy vago que sólo es un poco desordenado:

Se puede escribir un pequeño envoltorio para git-add. Antes de llamar realmente al git-add, el contenedor empujaría un número de versión en algún lugar del módulo donde se puede encontrar con un simple regex.

Actualización:

Actualmente no estoy usando algo así a mí mismo, pero estoy seriamente pensando en ella.

Mi razonamiento actual:

  • A diferencia de CVS o la subversión, Git no sabe nada acerca de la versión de revisión o números.
  • Los controladores de filtro necesitarían tener una fuente de información diferente para poder insertar un número de versión y esta fuente debería estar disponible en la máquina de cualquiera de los desarrolladores involucrados.
  • Por lo tanto, la mejor fuente para un número de versión es el propio archivo versionado.
  • Y para que el archivo se pueda utilizar como fuente para el próximo número de versión, el número de versión debe ser parte de su correspondiente git blob.

Beneficios:

  • Esto es tan automático como se pone, no hay manera de que se olvide de actualizar su número de versión.
  • transición suave de CVS/SVN a git. Cada compromiso presenta una nueva versión.

inconvenientes:

  • El desarrollador perezoso que siempre hace git add . va a empujar a los números de versión de los archivos que no tocó.
  • No parece haber una forma de imponer el uso del script de contenedor.
+0

No hay necesidad de un contenedor: esto es lo que hacen los controladores de filtro. –

+0

No. Eso no es lo que hacen. Un controlador de filtro borrará un archivo al finalizar la compra y lo limpiará al agregarlo. Lo que sugiero es un número de versión que realmente llegue al blob y, por lo tanto, a la lista de revisión. – innaM

+1

De hecho, este no es el propósito del filtro, pero el enlace 'pre-commit 'puede funcionar mejor que el wrapper alrededor de' add'. –

3

¿Qué se utiliza para construir su módulo Perl?

La solución utilizada por el núcleo de Linux y por el proyecto Git en sí es reemplazar "++ ++ versión" (o "++ ++ PROJECT_VERSION", o "@@ @@ PROJECT_VERSION") marcadores de posiciónpor el sistema de construcción, en ese caso por Makefile. (En los archivos en C se hace definiendo la constante de preprocesador "PROJECT_VERSION" a través de la opción '-DPROJECT_VERSION=$(PROJECT_VERSION)' que se pasa al compilador). En su caso, eso sería probablemente algo así como Module::Install, Module::Build, o ExtUtils::MakeMaker.

Tanto Git ans Linux kernel usa para ese guión GIT-VERSION-GEN cuales:

  1. utiliza git describe si el proyecto se construye desde dentro repositorio git,
  2. verano en version (o VERSION o GIT-VERSION-FILE) presentar si la acumulación se realiza desde una instantánea (este archivo se crea al crear una instantánea/archivo),
  3. y finalmente recurre al número de versión predefinido, cuyo número se actualiza en la confirmación que marca una nueva versión (por ejemplo, cb572206 commit en el repositorio de git, también conocido como commit v1.6.4.4).

Espero que te ayude.

Cuestiones relacionadas