2009-12-17 4 views
20

Sto creando gli archetipi Maven 2 per il nostro progetto (Weld). Vorrei poter controllare quali file vengono inseriti nel progetto generato in base al valore di una proprietà definita durante archetype:generate. Per esempio, prevedo il seguente messaggio:Come faccio a includere o escludere condizionatamente un file da un archetipo quando viene generato un progetto?

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

Sulla base del valore di includeGradleSupport, voglio includere (o non includere) il file build.gradle nel progetto generato. Se l'utente non desidera il supporto Gradle, non voglio ingombrare il progetto generato con file non necessari.

Un altro esempio è che potrebbe essere necessario fornire un frammento di Jetty per il web (per attivare forse un ascoltatore) se l'utente desidera il supporto di Jetty.

Si tratta di personalizzare il progetto in base a ciò che lo sviluppatore intende utilizzare. Mentre potrei creare un intero altro archetipo, a volte le modifiche sono così lievi che sarebbe più facile includere/escludere un file.

Esiste un modo per controllare questo comportamento utilizzando il descrittore archetype-metadata.xml?

+1

In base a questo problema: http://jira.codehaus.org/browse/ARCHETYPE-58 questa funzione è in arrivo. Ora abbiamo solo bisogno di vedere alcuni documenti (per quanto tempo potrebbe essere?) –

+0

Ho lavorato su un progetto per un po 'che usava i profili per questo tipo di comportamento e andava male e le nostre build e poms erano estremamente complicate. Alla fine, siamo giunti alla conclusione che la cosa migliore da fare è impostare una nuova struttura di progetto in cui il nostro codice applicativo principale è stato azzerato e quindi le diverse configurazioni di implementazione erano configurazioni completamente diverse che dipendevano dal progetto principale. Questo crea un sacco di build e progetti, ma sono tutti semplici e facili da mantenere e hanno un singolo artefatto. –

risposta

0

Posso dare un'occhiata a quale codice ci vorrebbe per abilitare questo nel plugin archetype.

Penso che il veicolo principale per fare questo oggi sarebbe quello di produrre condizionatamente due diversi artefatti archetipo durante la costruzione originale. L'utente archetipo utilizzerà quindi in modo esplicito yourarchetype-withthing o yourarchetype-withoutthing.

So che questo non è perfettamente quello che cerchi e sono d'accordo che ciò che stai chiedendo è un caso d'uso ragionevole.

+2

Hmm, la creazione di più artefatti dallo stesso progetto andrebbe contro la filosofia di Maven (un progetto => un artefatto). Penso davvero che questa sarebbe una cosa utile. Posso usare velocity all'interno di un file per cambiare il contenuto, ma quello che non posso fare è includere o escludere interi file, che è davvero un'estensione della stessa idea. Aspetto con ansia il tuo prototipo;) –

0

Mentre potevo creare un intero altro archetipo, a volte le modifiche sono talmente lievi che sarebbe più facile includere/escludere un file.

Questa frase mi ha fatto pensare ...

Sembra che si dispone di una struttura di progetto di default.
Supponiamo che sia grande, abbia molti file. Ovviamente, non vuoi duplicare la logica e i file in un archetipo diverso.

A volte, un progetto ha un comportamento aggiuntivo (correlato a Gradle).
Suona come un tipico caso d'uso per un altro archetipo che non parte dal nulla, ma viene dopo il primo. Ho visto diversi esempi di tali archetipi sul web. Lo sviluppatore attiva questo archetipo solo se il progetto ha bisogno di Graddle. :-)

Quindi suggerisco: crea il tuo archetipo di Graddle, che aggiunge solo i file relativi a Graddle.

+0

Stai dicendo che dovremmo avere quello che viene definito un archetipo "parziale" che si sovrappone a un progetto esistente (presumibilmente creato dall'archetipo di base)? Sembra ancora troppo lavoro per lo sviluppatore finale. Non vogliono eseguire due archetipi: generano comandi, ne vogliono eseguire uno. Se, d'altra parte, stai suggerendo di creare un secondo archetipo che si fonde nei file di addizione in un archetipo di base, a me che rompe la convenzione in Maven in cui un progetto produce un artefatto. Forse se l'archetipo può estrarre i file condivisi, questa sarebbe un'altra possibilità. –

+0

@Dan Stavo suggerendo la soluzione parziale dell'archetipo :-). Credo che la complessità concettuale sia la stessa per lo sviluppatore finale, perché deve conoscere le due nozioni in tutti i casi. Nell'implementazione, puoi assicurarti che non deve fare più digitazione ;-). Inoltre, dovrebbe essere facile racchiudere le chiamate ai due con un singolo comando, se necessario, non dovrebbe? – KLE

1

Personalmente mi spostare le parti che possono essere rimossi/aggiunti su richiesta dell'utente e mettere il in diverse maven profiles così u può costruire parte diversa utilizzando profili diversi

+0

Sì, questo è certamente un approccio valido. Ma nel nostro caso, vogliamo minimizzare la complessità del progetto generato per motivi di usabilità. Quando lo sviluppatore sceglie la configurazione del servlet, ad esempio, vogliamo che la build soddisfi solo quel singolo scenario. –

Problemi correlati