2012-10-19 18 views
9

Sto tentando di creare un modo in cui è possibile ottenere build ermetici pur facendo affidamento su dipendenze SNAPSHOT nel progetto.Creazione di build meccaniche ermetiche

Ai fini della esempio, dire che ho un progetto che ha una struttura di dipendenze come questa:

   ┌ other-1.2-SNAPSHOT 
mine-1.2.3 ──┤ 
      └ thing-3.1-SNAPSHOT ── gizmo-6.1.3-SNAPSHOT 

Quello che vorrei fare è risolvere tutte le dipendenze SNAPSHOT a livello locale per qualcosa che è legato alla mia versione corrente e quindi distribuirli come release al repository di release del mio Nexus. Non tutte queste dipendenze sono interne, quindi non posso semplicemente rilasciarle su ciascuna.

Quindi, in questo esempio, other-1.2-SNAPSHOT sarebbe diventato qualcosa di simile other-1.2-mine-1.2.3 e thing-3.1-SNAPSHOT sarebbe diventato thing-3.1-mine-1.2.3. Questo è relativamente banale in circa 60 linee di python.

Il problema, tuttavia, consiste nel risolvere gli SNAPSHOT transitivi nelle versioni concrete. Quindi ho anche bisogno di convertire gizmo-6.1.3-SNAPSHOT in gizmo-6.1.3-mine.1.2.3 e avere thing-3.1-mine-1.2.3 dipende da questo.

Questo è solo un esempio di un modo in cui ottenere ciò che voglio. L'obiettivo è che in un anno o due lungo la strada posso controllare il mio ramo di rilascio per la versione 1.2.3 ed essere in grado di eseguire mvn clean package o simili senza doversi preoccupare di risolvere dipendenze SNAPSHOT scadute da tempo.

E 'importante che questo ramo sia compilabile e non solo mantiene tutte le dipendenze che utilizzano qualcosa come il jar-and-dependencies funzionalità del plugin di montaggio. Mi piacerebbe potenzialmente poter modificare i file di origine e creare un altro build di rilascio (ad esempio applicando un hotfix).

Quindi,

  • C'è qualcosa di simile a disposizione che sarà in grado di convertire le dipendenze SNAPSHOT in modo ricorsivo per essere concreti?
  • Ci sono dei plugin che gestiscono questo tipo di cose per te? Il plug-in di rilascio era promettente con alcune opzioni di configurazione sul suo obiettivo branch ma non risolve i deps esterni nella misura desiderata.
  • Sono disponibili altre tecniche per creare build ermetici di Maven?
+3

Suona come un anti maven hack per me. In Maven, una delle regole fondamentali di base è ** Convenzione sulla configurazione **. Se le dipendenze vengono create da soli, è necessario gestire/utilizzare correttamente la versione SNAPSHOT/RELEASE. Se provengono da qualche altra parte, dovresti sempre usare la versione più recente (non la versione SNAPSHOT). Dai una seconda occhiata a [Maven The Complete Reference - sezione 3.3.1] (http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-pom-syntax.html#pom-reationships -seleziona-versioni) e vedere perché SNAPSHOT è utilizzato in Maven. – yorkw

+0

Comprendo molto bene i fondamenti di Maven. Tuttavia, vivo nel mondo reale con scadenze e librerie di terze parti che sono incredibilmente utili e tuttavia siedono su versioni SNAPSHOT per lunghi periodi di tempo. Jason Van Zyl, qualcuno che potresti conoscere, ammette perfino che l'idea di avere un sistema pesante per processi attorno alle uscite è stato un grosso errore (e sta cambiando con Tesla). A meno di mantenere le forcelle interne di tutto il progetto che consumiamo, quello che sto facendo è in realtà un salto da gigante meglio di quanto farebbero molti altri. –

+1

bene anche nel mondo reale dovrebbe essere preso in considerazione qualche motivo. Stai combattendo il sistema qui. Come hai detto, le istantanee non vivono abbastanza a lungo, anche se si utilizzano istantanee con timestamp per fare affidamento sulla risoluzione degli artefatti. Il mio approccio sarebbe quello di utilizzare la dipendenza e distribuire plugin per recuperare tutte le risorse e distribuire le dipendenze dello snapshot conosciute nel proprio repository Maven utilizzando uno script o un plug-in self-made-maven. Forse anche parlare con gli altri aggeggi aiuta: se riescono a rilasciare versioni beta dei loro artefatti, ci si può fidare di quelli senza troppi problemi. – wemu

risposta

2

Questa non è una tecnica ampiamente utilizzata, ma si può sempre controllare le dipendenze determinata istantanea nel progetto come un repository "progetto", come descritto in questo post del blog: Maven is to Ant as a Nail Gun is to a Hammer

In breve, utilizzare il plugin Dipendenze per creare il repository situato nella directory del progetto. Il sotto è copiato dal post sul blog collegato (che si dovrebbe leggere):

1) Eseguire mvn -Dmdep.useRepositoryLayout=true -Dmdep.copyPom=true dependency:copy-dependencies

"Questo crea/target/dipendenze con un layout pronti contro termine, come di tutti i vostri progetti dipendenze"

2) Copia target/dependencies/ a qualcosa come libs/

3) Aggiungere una dichiarazione repository come la seguente al vostro POM:

<repositories> 
    <repository> 
    <releases /> 
    <id>snapshots-I-need-forever</id> 
    <name>snapshots-I-need-forever</name> 
    <url>file:///${basedir}/libs</url> 
    </repository> 
</repositories> 

fate questa una parte automatizzata del processo di generazione/release: passo 1 configurando il plugin dipendenze ad un phasephase ciclo di vita, e punto 2, mediante AntRun Plugin per spostare le dipendenze scaricate nel posto giusto ..

Spero che questo lavora per te Devo andare a fare una doccia ora ...

+0

Non l'ho fatto esattamente, ma i viaggiatori futuri vorranno probabilmente questa soluzione. Ho creato uno speciale repository nexus e distribuito versioni personalizzate e poi aggiorno il pom tramite uno script, proprio come ho descritto nel post originale. Ho usato questa tecnica nel mio ultimo lavoro, tuttavia, e ha funzionato brillantemente per un caso d'uso simile. –

2

Il plug-in di versioni di Maven farà la maggior parte di ciò che desideri.

http://mojo.codehaus.org/versions-maven-plugin/

Tuttavia sarà quasi certianly necessario eseguirlo in una fase di pre-build in cui a risolvere tutte le dipendenze e aggiornare il file pom di conseguenza. Quindi ri-eseguire Maven (che rilegge il pom) per eseguire la build reale. Potresti essere in grado di configurare qualsiasi cosa all'interno del pom stesso innescata con un obiettivo separato evitando così uno script separato.

Questo funziona meglio se si utilizzano versioni particolari anziché dipendenze SNAPSHOT e si consente al passaggio di pre-generazione di aggiornarle se necessario. L'unica vera differenza per la risoluzione delle dipendenze è che Maven eseguirà sempre il download delle dipendenze di -SNAPSHOT mentre scaricherà solo le dipendenze normali se è disponibile una nuova versione. Tuttavia molti plugin (incluso il plugin delle versioni) trattano le dipendenze di -SNAPSHOT in modo diverso causando problemi.Dal momento che ogni build CI ha un nuovo numero di versione, non uso mai -SNAPSHOT, preferendo un tag diverso come -DEV con un comportamento più prevedibile per cose come build locali dello sviluppatore ecc.

Ho passato molto tempo a convincere Maven a fare cose simili a questo. La maggior parte dei progetti di maven che conosco hanno una sorta di passo pre-compilazione per impostare i numeri di versione o aggirare altre limitazioni come questa. Provare a fare tutto questo in un solo passaggio di solito fallisce perché Maven legge solo il pom una volta, la sostituzione delle stringhe non funziona in alcuni punti e il pom distribuito/installato in genere non contiene i risultati della sostituzione delle stringhe o delle modifiche apportate durante la costruzione.

Problemi correlati