2011-11-02 4 views
31

Sono nuovo di sbt. Voglio che metta tutte le moschette del barattolo delle dipendenze e il mio file jar in un unico posto. SBT eseguirà l'app, ma ho varie dipendenze sparse in giro e una cartella .ivy piena di cose il mio file jar dipende indirettamente. Quindi c'è un semplice comando per copiarli tutti in un unico posto in modo che io possa distribuirlo su un'altra macchina?come faccio a ottenere sbt per raccogliere tutti i file jar in cui il mio codice dipende da un unico punto?

+3

Sì, questo è vero e proprio dolore. Forse mi sono perso qualcosa ma davvero non capisco perché questa non è una parte di _Simple_ Build Tool –

+0

@AlexPovar: Suppongo che ci siano così tanti modi per farlo che sceglierne uno e standardizzarlo potrebbe essere dannoso (ma sono d'accordo) . –

risposta

10

Creare un'attività nel file di build in questo modo:

lazy val copyDependencies = TaskKey[Unit]("pack") 

def copyDepTask = copyDependencies <<= (update, crossTarget, scalaVersion) map { 
    (updateReport, out, scalaVer) => 
    updateReport.allFiles foreach { 
     srcPath => 
     val destPath = out/"lib"/srcPath.getName 
     IO.copyFile(srcPath, destPath, preserveLastModified = true) 
    } 
} 

aggiungere l'attività a un progetto come questo:

lazy val HubSensors = 
    Project("HubSensors", file("HubSensors"), settings = shared ++ Seq(
    copyDepTask, 
    resolvers ++= Seq(novusRels), 
    libraryDependencies ++= Seq(
     jodatime 
    ) 
)) dependsOn(HubCameraVision, JamServiceProxy, HubDAL) 

Nel tipo di console SBT:

project [Project Name] 
pack 
+1

Vedo due difficoltà in questo approccio, in particolare con i progetti di grandi dimensioni: 1. L'esecuzione di _update_ su più progetti con interdipendenze finisce per copiare lo stesso file .jar più di una volta; 2. Si può avere la stessa dipendenza ma con versioni distinte copiate. Ciò accade in generale con le librerie popolari, come log4j e apache-commons, perché lo stesso artefatto è referenziato in modo transitorio da più dipendenze. Vedere l'attività '' sfrattato'' per ulteriori informazioni. Si può fare qualcosa come (pseudo codice) "allFiles - sfrattati", ma è tutt'altro che banale. Dovrai immergerti in profondità nell'API SBT. –

+0

Ma, per i piccoli progetti, il tuo approccio sarebbe perfetto. –

8

Try sbt-pack plug https://github.com/xerial/sbt-pack, che raccoglie tutti i barattoli dipendenti nella cartella di destinazione/pack e anche genera script di lancio.

+3

Mi sono appena trasferito da sbt-onejar a sbt-pack e devo dire che è molto bello: veloce, facile da usare e affidabile. –

4

Si potrebbe anche provare SBT Native Packager: https://github.com/sbt/sbt-native-packager (SBT 0.7+)

Questo è ancora un WIP, ma sarà utilizzato in Play Framework 2.2 nelle prossime settimane. Con questo, è possibile creare file ZIP standalone, pacchetti Debian (DEB), pacchetti di installazione di Windows (MSI), DMG, RPM e così via.

+0

Per aiutare un po 'di più, con sbt-native-packager installato, si farebbe 'sbt stage' per ottenere i file in' target/universal/stage' – akauppi

10

Aggiungere la seguente riga al file build.sbt.

retrieveManaged := true 

Questo raccoglierà le dipendenze a livello locale

+1

Grazie per il suggerimento. Come lo sapevi - c'è un link alla documentazione di 0.13.13 sbt (non ho trovato). Funziona - 'sbt compile' raccoglie le dipendenze sotto' lib_unmanaged/'. – akauppi

+1

Menzionato in http://www.scala-sbt.org/0.13/docs/Faq.html#Where+has+0.7%E2%80%99s++gone%3F – akauppi

+0

Grazie mille, mi piace questo approccio, don Voglio creare un plugin per la differenza. Tuttavia, sembra che retrieveManaged non ottenga la dipendenza dalla libreria java che è gestita da Maven, se esiste una soluzione al riguardo? – carfield

Problemi correlati