2013-01-31 9 views
5

Es ist einfach verwaltete Bibliothek Abhängigkeiten in SBT zu erklären, zBWie zwischen Projekt und Bibliothek Abhängigkeiten in SBT wechseln?

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

Und während es nicht so einfach ist, Projektabhängigkeiten in SBT zu erklären, was ich tun kann, dass auch:

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

Aber in der Praxis, Ich möchte normalerweise zwischen Projektmodus, wo Änderungen sind sofort sichtbar in Upstream-Projekten, und Bibliotheksmodus, wo ich Änderungen veröffentlichen, um sie in abhängigen Projekten zu sehen, wie Code reift.

Früh Code-Basis des Lebens, oder wann immer ich bin zu wollen häufige Änderungen über Module machen, ich will nicht den Aufwand für die Wieder publishing kurz vor Änderungen zu sehen. Aber im stabilen/ausgereiften Code möchte ich genau angeben, auf welche Version ich angewiesen bin.

Es scheint, als ob SBT die zwei Abhängigkeiten als völlig anders behandelt. Gibt es eine einfachere Möglichkeit, zwischen Projekt- und Bibliotheksabhängigkeiten zu wechseln, als meine Builddefinition neu zu schreiben?

+0

vielleicht ist diese Frage/Antwort etwas Hilfe für Sie: http://StackOverflow.com/Questions/14351940/setting-up-SBT-environment-to-hack-on-multiple-Libraries-at-once/14352600# 14352600 –

Antwort

3

Ich habe ein paar Szenarien für meine sbt-Skripte (Tests, Veröffentlichung, Produktion). Ich starte sbt von Skript (von Bash, Sie können andere Umgebung haben) mit DO=TESTS sbt zum Beispiel. Dies ist meine dynamischen Abhängigkeiten bezüglich der Umgebungsvariablen:

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" 
    ) 
    } 
) 
} 

Wie man sehen kann ich verschiedene Projekteinstellungen mit einzelner .sbt Definition kann durch eine Umgebungsvariable gesteuert. Die Umgebungsvariable betrifft alle Projekt-/Unterprojektgruppen.

+0

Obwohl in diesem Beispiel nur Einstellungen angezeigt werden, die von einer Umgebungsvariablen geändert werden, könnte dies auch für die ursprüngliche Frage gelten. Systemeigenschaften sind ebenfalls eine Option. Das heißt, ich bevorzuge die Vermeidung von Systemeigenschaften/env-Variablen, so dass ich normalerweise eine benutzerdefinierte Einstellung für das Szenario in dieser Antwort verwende.Für die ursprüngliche Frage sind Einstellungen nicht verfügbar, wenn Abhängigkeiten zwischen Projekten definiert werden. Wenn also Env-Variablen/-Eigenschaften nicht elegant sind, könnten Sie es schlechter machen. –

3

Es stimmt, dass die zwei Arten von Abhängigkeiten ziemlich unterschiedlich behandelt werden und es wäre schön, wenn sie nicht wären. Das Haupthindernis ist, dass sbt über alle externen Projekte informiert werden muss, bevor die Einstellungen geladen werden (aus verschiedenen Gründen).

Für jetzt ist die einfachste Lösung wahrscheinlich eine Umgebungsvariable oder Systemeigenschaft, wie in einer anderen Antwort beschrieben. In Zukunft ist die folgende sehr nahe möglich in sbt zu sein, aber braucht noch etwas mehr Arbeit:

  1. eine Abhängigkeit erklären wie üblich

    libraryDependencies += "org.example" % "rich-util" % "0.1" 
    
  2. die Quelle Abhängigkeit von der Kommandozeile hinzufügen, die normalen Abhängigkeitsüberschreiben automatisch in dem Prozess

    $ sbt 
    > projects add ../RichUtil 
    

die conv Der in der Setting up sbt environment to hack on multiple libraries at once beschriebene, auf Ention basierende Ansatz ist ein Spezialfall und würde durch diese Arbeitsweise ebenfalls ermöglicht werden.

Verwandte Themen