2013-01-31 11 views
5

Łatwo zadeklarować zarządzanych zależności biblioteka w SBT, npJak przełączać się między zależnościami projektu i biblioteki w SBT?

libraryDependencies ++= Seq(
"org.specs2" %% "specs2" % "1.12.2" % "test" , 
"junit" % "junit" % "4.7" % "test" 
) 

I choć nie jest to tak proste, aby zadeklarować zależności projektu w SBT, można to zrobić za:

object RichMath extends Build { 
    lazy val myApp = Project("RichMath", file(".")) dependsOn(richUtil) 
    lazy val richUtil = RootProject(file("../RichUtil")) 
} 

Jednak w praktyce Zazwyczaj chcę zmienić tryb trybu projektu, w którym zmiany są natychmiast widoczne w projektach nadrzędnych i tryb biblioteki, gdzie muszę opublikować zmiany, aby zobaczyć je w projektach zależnych, gdy dojrzewa kod.

Wczesne życie w bazie kodu lub gdy chcę wprowadzić częste zmiany w modułach, nie chcę kłopotów z ponownym publikowaniem tylko po to, aby zobaczyć zmiany w górę. Ale w stabilnym/dojrzałym kodzie, chcę dokładnie określić, której wersji jestem zależna.

Wygląda na to, że SBT traktuje te dwie zależności jako zupełnie różne. Czy istnieje bardziej prosty sposób przełączania zależności między projektami a bibliotekami niż przepisywanie definicji mojej kompilacji?

+0

Może to pytanie/odpowiedź jest dla ciebie pomocne: http://stackoverflow.com/questions/14351940/setting-up-sbt-environment-to-hack-on-multiple-libraries-at-once/14352600# 14352600 –

Odpowiedz

3

Mam kilka scenariuszy dla moich skryptów sbt (testy, publikowanie, produkcja). Zaczynam sbt od skryptu (z basha, możesz mieć inne środowisko) z DO=TESTS sbt na przykład. To jest moje dynamiczne współzależności z uwzględnieniem zmiennej środowiskowej:

if (sys.env.contains("LOCAL_BUILD")) { 
    Seq[Project.Setting[_]](
    unmanagedResourceDirectories in Compile <+= baseDirectory { _/"src"/"main"/"scala" }, 
    libraryDependencies ++= { 
     Seq(
     "org.digimead" %% "digi-lib-slf4j" % "0.2.1-SNAPSHOT" % "test", 
     "org.digimead" %% "digi-lib-test" % "0.2.1-SNAPSHOT" % "test", 
     "org.scalatest" %% "scalatest" % "1.9" % "test" 
    ) 
    } 
) 
} else { 
    Seq[Project.Setting[_]](
    libraryDependencies ++= { 
     Seq(
     "org.slf4j" % "slf4j-log4j12" % "1.7.1" 
    ) 
    } 
) 
} 

Jak widać mogę mieć różne ustawienia projektu z definicji pojedynczego .sbt kontrolowany przez jeden zmiennej środowiskowej. Zmienna środowiskowa wpływa na cały pakiet projektu/podprojektu.

+0

Mimo że w tym przykładzie pokazano tylko ustawienia zmienione przez zmienną środowiskową, może to również dotyczyć pytania oryginalnego. Właściwości systemu są również opcją. Powiedział, że wolę unikać właściwości systemu/zmiennych env, więc zwykle użyłbym niestandardowego ustawienia dla scenariusza w tej odpowiedzi.W przypadku pierwotnego pytania ustawienia nie są dostępne podczas definiowania zależności między projektami, więc podczas gdy zmienne/właściwości env nie są eleganckie, można zrobić coś gorszego. –

3

To prawda, że ​​te dwa typy zależności traktowane są raczej odmiennie i byłoby miło, gdyby nie były. Główną przeszkodą jest to, że sbt musi wiedzieć o wszystkich zewnętrznych projektach przed załadowaniem ustawień (z różnych powodów).

Na razie najprostszym rozwiązaniem jest prawdopodobnie zmienna środowiskowa lub właściwość systemu, jak opisano w innej odpowiedzi. Idąc dalej, po to bardzo blisko jest możliwe w SBT, ale potrzebuje trochę więcej pracy:

  1. zadeklarować zależność jak zwykle

    libraryDependencies += "org.example" % "rich-util" % "0.1" 
    
  2. Dodaj zależność źródłowego z wiersza poleceń, nadrzędne normalnego zależność automatycznie w procesie

    $ sbt 
    > projects add ../RichUtil 
    

Konw podejście oparte na entionach opisane w Setting up sbt environment to hack on multiple libraries at once jest szczególnym przypadkiem i mogłoby być również włączone przez to działanie.

Powiązane problemy