2009-12-17 17 views
20

Estoy creando arquetipos Maven 2 para nuestro proyecto (Weld). Me gustaría poder controlar qué archivos se colocan en el proyecto generado en función del valor de una propiedad que se define durante archetype:generate. Por ejemplo, preveo el siguiente mensaje:¿Cómo incluyo o excluyo condicionalmente un archivo de un arquetipo cuando se genera un proyecto?

Define value for groupId: : com.example 
Define value for artifactId: : myproject 
Define value for package: com.example: : 
Define value for includeGradleSupport: : y 

Con base en el valor de includeGradleSupport, quiero incluir (o no incluir) el archivo build.gradle en el proyecto generado. Si el usuario no quiere la compatibilidad con Gradle, no quiero saturar el proyecto generado con archivos innecesarios.

Otro ejemplo es que podría necesitar proporcionar un fragmento web Jetty (para activar un oyente) si el usuario quiere soporte Jetty.

Todo se trata de la personalización del proyecto en función de lo que el desarrollador pretende utilizar. Si bien podría crear otro arquetipo completo, a veces los cambios son tan pequeños que sería más fácil incluir/excluir un archivo.

¿Hay alguna manera de controlar este comportamiento utilizando el descriptor archetype-metadata.xml?

+1

De acuerdo con este problema: http://jira.codehaus.org/browse/ARCHETYPE-58 esta característica está en camino. Ahora solo necesitamos ver algunos documentos (¿cuánto tiempo podría esperar?) –

+0

Trabajé en un proyecto durante un tiempo que usó perfiles para este tipo de comportamiento y que funcionó mal y nuestras construcciones y poms fueron extremadamente complicados. Al final llegamos a la conclusión de que lo mejor que podía hacer era establecer una nueva estructura de proyecto donde nuestro código principal de la aplicación se agitara y luego las diferentes configuraciones de implementación fueran construcciones completamente diferentes que tenían una dependencia en el proyecto principal. Esto crea muchas construcciones y proyectos, pero todos son simples y fáciles de mantener y tienen un solo artefacto. –

Respuesta

0

Puedo ver qué codificación tomaría para habilitar esto en el plugin de arquetipo.

Creo que el vehículo principal para hacer esto hoy en día sería producir condicionalmente dos artefactos de arquetipo diferentes durante la compilación original. El usuario del arquetipo usaría explícitamente yourarchetype -thingthing o yourarchetype -thingthing.

Sé que esto no es perfectamente lo que buscas y estoy de acuerdo en que lo que estás pidiendo es un caso de uso sensato.

+2

Hmm, crear artefactos múltiples del mismo proyecto iría en contra de la filosofía de Maven (un proyecto => un artefacto). Realmente creo que esto sería útil. Puedo usar la velocidad dentro de un archivo para cambiar el contenido, pero lo que no puedo hacer es incluir o excluir archivos completos, que en realidad es una extensión de esa misma idea. Espero con interés su prototipo;) –

0

Si bien podría crear otro arquetipo completo, a veces los cambios son tan pequeños que sería más fácil incluir/excluir un archivo.

Esta frase me hizo pensar ...

Parece como que tiene una estructura de proyecto por defecto.
Supongamos que es grande, tiene muchos archivos. Por supuesto, no desea duplicar la lógica y los archivos en un arquetipo diferente.

Ahora, a veces, un proyecto tiene un comportamiento adicional (relacionado con Gradle).
Suena un caso de uso típico para otro arquetipo que no comienza de la nada, sino que viene después del primero. He visto varios ejemplos de tales arquetipos en la web. El desarrollador activa este arquetipo solo si el proyecto necesita Graddle. :-)

Así que sugiero: crear su arquetipo de Graddle, que solo agrega los archivos relevantes para Graddle.

+0

¿Está diciendo que deberíamos tener lo que se denomina un arquetipo "parcial" que se superpone a un proyecto existente (presumiblemente creado por el arquetipo base)? Eso todavía suena como demasiado trabajo para el desarrollador final. No quieren ejecutar dos arquetipos: generar comandos, quieren ejecutar uno. Si, por otro lado, está sugiriendo que creamos un segundo arquetipo que combine los archivos de adición en un arquetipo base, para mí eso rompe la convención en Maven, donde un proyecto produce un artefacto. Quizás si el arquetipo puede extraer archivos compartidos, esa sería otra posibilidad. –

+0

@Dan sugerí la solución de arquetipo parcial :-). Creo que la complejidad conceptual es la misma para el desarrollador final, porque tiene que conocer las dos nociones en todos los casos. En la implementación, puedes asegurarte de que no tiene que escribir más ;-). Además, debería ser fácil envolver las llamadas a las dos por un solo comando si es necesario, ¿no es así? – KLE

1

yo personalmente mover las piezas que se pueden quitar/agregar a petición del usuario y poner el en diferentes maven profiles así que se puede construir diferentes partes utilizando diferentes perfiles

+0

Sí, ese es ciertamente un enfoque válido. Pero en nuestro caso, queremos minimizar la complejidad del proyecto generado por razones de usabilidad. Cuando el desarrollador elige la configuración del servlet, por ejemplo, queremos que esa compilación solo se adapte a ese único escenario. –

Cuestiones relacionadas