2012-01-09 4 views
34

Ho un progetto multiprogetto SBT, che appare come l'esempio a SBT doc:Come disabilitare il pacchetto e pubblicare le attività per il modulo di aggregazione radice in build multi-modulo?

import sbt._ 
import Keys._ 

object HelloBuild extends Build { 
    lazy val root = Project(id = "hello", 
         base = file(".")) aggregate(foo, bar) 

    lazy val foo = Project(id = "hello-foo", 
         base = file("foo")) 

    lazy val bar = Project(id = "hello-bar", 
         base = file("bar")) 
} 

Perché root è solo un progetto virtuale di aggregare due sottoprogetti, vorrei evitare la generazione del pacchetto (e la pubblicazione artefatto), ma continuano a generare pacchetti (e pubblicare) per entrambi i sottoprogetti.

C'è un modo semplice per raggiungerlo?

risposta

25

In realtà, è è piuttosto facile. Basta ignorare l'impostazione per publish nel progetto principale:

base = file(".")) settings (publish := { }) aggregate(foo, bar) 
+2

Non funziona. Almeno quando provo 'publish-local', lo stills crea/pubblica un jar vuoto per il progetto root. (Uso sbt 0.11.2) – paradigmatic

+1

@paradigmatic Hai sovrascritto publish-local? È necessario sovrascrivere qualsiasi passaggio che non si desidera eseguire sulla radice. L'ho provato con un progetto vuoto contenente due sottoprogetti come nel tuo esempio, e questo ha impedito alla pubblicazione di fare qualsiasi cosa nella root. –

+0

Ho anche provato questo stesso esempio senza override e ancora pubblichiamo artefatti per i 3 sottoprogetti. È davvero strano – paradigmatic

-5

Aggiungi

publish := false 

al sottoprogetto (progetto root) build.sbt per evitare la pubblicazione di

+0

Il target di pubblicazione non accetta un valore booleano –

7

Di seguito ha lavorato per me (questo può essere utilizzato anche in altri sottoprogetti):

lazy val root = Project(
    id = "root", 
    base = file("."), 
    aggregate = Seq(foo, bar), 
    settings = Project.defaultSettings ++ Seq(
    publishLocal := {}, 
    publish := {} 
) 
) 

(sbt 0.12.2)

+1

Questo non funzionerà per publishSigned e publishLocalSigned: è meglio disattivare la pubblicazione di elementi come indicato nella risposta sopra. –

+1

@MikeAllen Poiché l'ordine delle risposte cambia, fare riferimento al nome di una persona sarebbe meglio di "sopra". – akauppi

+0

Questo ha funzionato per me, mentre 'publishArtifact: = false' richiedeva ancora un repository per essere nominato. – akauppi

44

Invece di giocare Whac-a-mole elencando compiti specifici per disabilitare (publish, publish-local, publish-signed, ecc), un'altra opzione è quella di disattivare la pubblicazione artefatto alla fonte.

publishArtifact := false 

Anche se non c'è l'editoria accadendo, ho trovato anche avevo bisogno di fornire un valore publishTo per rendere il compito di SBT-PGP publish-signed felice. Ha bisogno di questo valore, anche se non lo usa mai.

publishTo := Some(Resolver.file("Unused transient repository", file("target/unusedrepo"))) 
+1

Il nome della chiave è 'publishArtifact' – EECOLOR

+7

mentre funziona funziona ancora crea e consegna file ivy.xml (almeno quando si esegue una pubblicazione locale) – Jean

+0

Si suppone che funzioni anche per progetti non root? – matanster

4

E 'meglio usare il impostazione publishArtifact. Funziona per ogni possibile modo di pubblicazione perché dipendono tutti da questa impostazione.

Se è necessario disattivare la pubblicazione in un certo progetto è possibile farlo fornendo il nome del progetto:

publishArtifact in root := false 

Ci radice è la definizione del progetto dalla domanda iniziale.

Dopo aver definito i progetti, è possibile inserire questa linea in qualsiasi punto del proprio build.sbt.

3

Per disattivare le operazioni pacchetto riscontrato, aggiungere

settings(packageBin := { new File("") }, 
     packageSrc := { new File("") }, 
     packageDoc := { new File("") }) 

al corrispondente Project (root o meno). La "stranezza" di questo approccio è dovuta a packageBin, & c., Di tipo TaskKey[File]. Uso questa tecnica con successo (a livello di root e in un'aggregazione intermedia).

Problemi correlati