2017-09-30 2 views
0

In SBT mehreren Projekten ist die Haupt-Webanwendung abhängig von einigen Unterprojekten. Als ich an das Stubbed-Modell dachte, würde ich gerne die Stubbed-Modellimplementierung zu einem getrennten Teilprojekt machen.SBT dynamische Projektabhängigkeit basierend auf Befehlszeilenargument

Problem: Die SBT-Projektabhängigkeit ist in SBT vordefiniert. Ich kann es nicht dynamisch abhängig von dem einen oder anderen Teilprojekt per Kommandozeile machen.

Das bedeutet, ich kann kein "release build" haben, um Web-Anwendungen nur von einem real implementierten Modul abhängig zu machen, oder eine "stubbed build", um die Web-App nur vom stubbed-Modul im selben Projektbaum abhängig zu machen .

Die Idee, die Abhängigkeiten zu trennen, ist: Ich möchte nicht die Produktfreigabe haben, die das stubbed Glas einschließt. Das Stub-Jar sollte nur in der Testumgebung verfügbar sein.

Frage: Kann ich die Befehlszeilenargumente verwenden, um SBT mitzuteilen, welches Teilprojekt abhängig sein soll?

Beim Start des Projekts am normalen Anlegesteg: Start, sollte das Hauptprojekt auf regulären Teilprojekt abhängen. Wenn ich die SBT mit einer Befehlszeile wie '-Stub = true' starte, möchte ich, dass das Hauptprojekt die Abhängigkeit von stubbed-Unterprojekten ändert. Da es eine Zeit geben sollte, sollte es entweder im Stub-Modell oder im Stub-Modell sein, der Compiler sollte eine Möglichkeit haben, die Abhängigkeiten zu aktualisieren. Ist es möglich, es in SBT zu tun?

Hier ist ein Beispielprojekt:

lazy val DataTier = Project(
    id = "dataTier", 
    base = file("dataTier")) 
} 

lazy val StubbedDataTier = Project(
    id = "stubbeddataTier", 
    base = file("stubbeddataTier")) 
} 

lazy val webApp = Project(
"tiny-web", 
    file(".")) 
.aggregate(
    DataTier, 
    StubbedDataTier 
) 
.dependsOn(
    if (getCmdLineArg("Stub") == "true") StubbedDataTier else DataTier 
) 

Wenn SBT laufen, können wir stubbed Modell tun:

./sbt ~jetty:start -Stub = true 

oder in der regulären Modell

./sbt ~jetty:start 

Wenn SBT nicht der Fall ist Unterstützen Sie es, ist es möglich, ein neues Feature für SBT so zu werden?

.dependsOn(
    if (getCmdLineArg("Stub") == "true") StubbedDataTier else DataTier 
) 

Antwort

0

Entschuldigung für die Beantwortung meiner eigenen Frage. Nachdem ich etwas versucht habe, habe ich einen Workaround gefunden, den ich hier teilen möchte, damit es für andere hilfreich sein kann.

Anstatt die Befehlszeile zu verwenden, verwende ich die Umgebungsvariable, um die Projektverknüpfung dynamisch zu steuern.

Dies ist Beispiel für Projekt configure:

lazy val DataTier = Project(
    id = "dataTier", 
    base = file("dataTier")) 
    .settings(commonSettings: _*) 

lazy val LiveDataTier = Project(
    id = "livedataTier", 
    base = file("livedataTier")) 
    .settings(commonSettings: _*) 
    .dependsOn(
    DataTier 
) 

lazy val StubDataTier = Project(
    id = "stubdataTier", 
    base = file("stubdataTier")) 
    .settings(commonSettings: _*) 
    .dependsOn(
    DataTier 
) 

lazy val webApp = Project("my-web", 
    file(".")) 
.aggregate(
    DataTier, 
    LiveDataTier, 
    StubDataTier 
) 
.dependsOn(
    DataTier 
) 

lazy val stubbed = System.getenv("Stub") match { 
    case "true" => { 
    System.out.print("The Stubbed model is turned on\n") 
    webApp.dependsOn(
     StubDataTier 
    ) 
    } 
    case _ =>{ 
    System.out.print("The Stubbed model is turned off\n") 
    webApp.dependsOn(
     LiveDataTier 
    ) 
    } 
} 

Die Datenebene der Schnittstelle nur definiert, dann ist der LiveDataTier und StubDataTier tun zwei Sätze der Umsetzung für die gleiche Datenebene. In der WebApp müssen Sie keinen Schalter für die Abhängigkeit haben, verwenden Sie ihn einfach so, als ob Sie nur ein Abhängigkeitsprojekt hätten.

Wenn es um die Stub-Modell ausgeführt werden, die Befehlszeile:

export Stub=true 

Dann normalen SBT bereinigter Build starten, dann wird das WebApp Projekt StubDataTier Link

indem Sie den Befehl Zeile:

export Stub=false 

Dann wird die WebApp LivedataTier als das Abhängigkeitsunterprojekt verwenden.

Standardmäßig wird es als die Abhängigkeit livetaTier verwendet.

Das funktioniert gut für mich.

Hinweis: Wenn Sie zwischen den beiden Abhängigkeiten wechseln, sollten Sie einen sauberen Build erstellen.

Verwandte Themen