2016-07-19 15 views
10

Odpowiedź na https://stackoverflow.com/a/21605652/1737727 pokazuje, jak zastąpić jedno ustawienie dla podprojektu zdefiniowanego za pomocą RootProject z głównego projektu. Zastanawiam się, czy jest to dobry sposób na zrobienie tego dla wielu ustawień, a następnie ewentualnie dla wielu podprojektów, więc nie musisz wymieniać każdej kombinacji osobno. Byłoby to zapobieganie proliferacji i zmniejszanie szansy na zapomnienie kombinacji i przypadkowe niedopasowanie ustawień.Użyj wspólnych ustawień w SBT `RootProject`

Gdy nie jest używany RootProject The SBT docs pokazać, jak to zrobić z wspólnej sekwencji ustawień:

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 
) 

Ale RootProject ma metodę ustalania jego ustawienia. Próbowałem czegoś takiego, zgodnie z odpowiedzią wymienioną powyżej:

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

, ale wydaje się, że nie jest to właściwe podejście.

Przyjrzałem się zakresowi Global lub ThisBuild, ale każdy podprojekt ustawia ustawienia we własnym pliku build.sbt, który ma pierwszeństwo przed tymi szerszymi zakresami, jeśli dobrze rozumiem.

Czy jest to dobry sposób, czy powinienem ręcznie ustawić każde ustawienie dla każdego podprojektu? Czy mogę używać różnych zakresów, np. podprojekty definiują ich ustawienia w Global i główny projekt w ThisBuild?

Odpowiedz

0

Dobrze mógłby to zrobić:

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

Stwarza to nowe Seq[Setting[_]] gdzie każdy z zakresów ustawienie zostanie zmienione, aby być w projekcie util. Jest to poprawny wpis w pliku sbt.

Inną opcją jest określenie wtyczkę SBT, że dodanie do obu głównych projektów i we własnym build.sbt RootProject za

Ale może warto rozważyć, jeśli rzeczywiście trzeba importować projekt util jako RootProject zamiast regularny podprojekt.

+2

To rzeczywiście działa, wielkie dzięki! Używam 'RootProject', ponieważ projekt podrzędny znajduje się w katalogu rodzica głównego projektu (jest współdzielony przez wiele projektów) i nie można wykonać' projektu w pliku ("../ util") '. Byłoby wspaniale się uczyć o lepszej drodze, choć może nie w pełni na temat tego pytania. – sgvd

+0

jeśli 'util' nie potrzebuje własnej kompilacji, możesz dodać ją bezpośrednio do' unmanagedSourceDirectories'. –