2017-09-30 6 views
0

Dans plusieurs projets SBT, l'application Web principale dépend de certains sous-projets. Quand je pensais au modèle Stubbed, je voudrais que l'implémentation du modèle stubbed devienne un sous-projet séparé.Dépendance de projet dynamique SBT basée sur l'argument de ligne de commande

Problème: La dépendance du projet SBT est prédéfinie dans SBT. Je ne peux pas le rendre dynamique dépendait de l'un ou l'autre des sous-projets par ligne de commande. Cela signifie que je ne peux pas avoir de "release build" pour que l'application web dépende uniquement d'un module implémenté réel, ou d'une "build stubbed" pour que l'application web dépende uniquement du module stubbed dans le même arbre de projets . L'idée de séparer les dépendances est la suivante: Je ne veux pas que le produit war release inclue le pot stubbed. Le pot stubbed ne doit être disponible que dans l'environnement de test. Question: Puis-je utiliser les arguments de ligne de commande pour indiquer à SBT quel sous-projet dépend?

Lors du démarrage du projet à la jetée normale: commencez, le projet principal doit être dépendant du sous-projet régulier. Si je démarre le SBT avec une ligne de commande comme '-Stub = true', alors je voudrais que le projet principal change la dépendance au sous-projet stubbed. Comme il faut donner un temps, il devrait être soit dans le modèle stubbed soit dans le modèle stubbed normal, le compilateur devrait avoir une chance de mettre à jour les dépendances. Est-il possible de le faire en SBT?

Voici un exemple de projet:

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 
) 

Exécuté SBT, nous pouvons faire le modèle bouchonné:

./sbt ~jetty:start -Stub = true 

ou dans le modèle régulier

./sbt ~jetty:start 

Si SBT ne le soutenir, est-il possible de devenir une nouvelle fonctionnalité pour SBT comme ça?

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

Répondre

0

Désolé pour répondre à ma question. Après avoir essayé quelque chose, j'ai trouvé une solution de contournement, je voudrais le partager ici afin qu'il puisse être utile pour d'autres personnes. Au lieu d'utiliser la ligne de commande, j'utilise la variable d'environnement pour contrôler dynamiquement le lien du projet.

Voici exemple de projet 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 
    ) 
    } 
} 

Le niveau de données défini l'interface uniquement, le LiveDataTier et StubDataTier font deux ensembles de la mise en œuvre pour le même niveau de données. Dans l'application Web, vous n'avez besoin d'aucun commutateur pour la dépendance, utilisez-le simplement comme si vous n'aviez qu'un seul projet de dépendance.

Quand il besoin d'être exécuté dans le modèle bouchonné, exécutez la ligne de commande:

export Stub=true 

ensuite commencer à SBT normale construction propre, le projet WebApp reliera à StubDataTier

En exécutant la commande ligne:

export Stub=false 

Ensuite, la webApp utilisera livedataTier comme le sous-projet de dépendance.

Par défaut, ce sera livedataTier en tant que dépendance.

Cela fonctionne très bien pour moi.

Remarque: Lorsque vous basculez entre les deux dépendances, vous devez effectuer une génération propre.