2016-07-19 110 views
10

La risposta allo https://stackoverflow.com/a/21605652/1737727 mostra come sovrascrivere un'impostazione per un sottoprogetto definito con RootProject dal progetto principale. Mi stavo chiedendo se c'è un buon modo per farlo per più impostazioni, e quindi anche per più sottoprogetti, quindi non è necessario elencare ogni combinazione separatamente. Questo sarebbe per prevenire la proliferazione e ridurre la possibilità di dimenticare una combinazione e accidentalmente avere una discrepanza tra le impostazioni.Utilizzare le impostazioni comuni in SBT `RootProject`

Quando non si utilizza RootProject, il SBT docs mostrano come fare questo con una sequenza comune di impostazioni:

lazy val commonSettings = Seq(
    organization := "com.example", 
    version := "0.1.0", 
    scalaVersion := "2.11.8" 
) 

lazy val core = (project in file("core")). 
    settings(commonSettings: _*). 
    settings(
    // other settings 
) 

lazy val util = (project in file("util")). 
    settings(commonSettings: _*). 
    settings(
    // other settings 
) 

Ma un RootProject non ha un metodo per impostare le relative impostazioni. Ho provato qualcosa come il seguente, secondo la risposta di cui sopra:

lazy val util = RootProject(file("../util")) 
commonSettings.map(_.key).foreach(key => key in util := key.value) 

ma questo non sembra essere l'approccio giusto.

Ho esaminato utilizzando Global o ThisBuild portata, ma ogni sottoprogetto imposta le impostazioni nel proprio build.sbt file, che ha la precedenza su questi ambiti più ampi se ho capito bene.

C'è un bel modo per farlo, o dovrei semplicemente impostare ogni impostazione per ciascun sottoprogetto manualmente? Dovrei utilizzare diversi ambiti, ad es. i sottoprogetti definiscono le loro impostazioni in Global e il progetto principale in ThisBuild?

risposta

0

Beh si potrebbe fare questo:

commonSettings.map { s => s.mapKey(Def.mapScope(_.in(util))) } 

Questo crea nuova Seq[Setting[_]] dove ognuno di oscilloscopi della impostazione viene modificata per essere nel progetto util. Questa è una voce valida in un file SBT.

Un'altra opzione è la definizione di un plug-SBT che si aggiunge a entrambi i vostri progetti principali e in proprio build.sbt di RootProject

Ma si può prendere in considerazione se effettivamente necessario importare il progetto util come RootProject invece di un sottoprogetto regolare.

+2

Questo funziona davvero, grazie! Io uso 'RootProject' perché il sottoprogetto si trova in una directory di pari livello del progetto principale (è condiviso da più progetti) e non si può fare' project in file ("../ util") '. Sarebbe bello conoscere un modo migliore, anche se forse non del tutto in argomento per questa domanda. – sgvd

+0

se 'util' non ha bisogno di una sua build, è possibile includere aggiungendo direttamente a' unmanagedSourceDirectories'. –

Problemi correlati