基于命令行参数

时间:2017-09-30 18:22:18

标签: dependencies sbt projects

在SBT多个项目中,主Web应用程序依赖于某些子项目。 当我想到Stubbed模型时,我想让stubbed模型实现成为一个独立的子项目。

问题:SBT项目依赖项是在SBT中预定义的。我无法通过命令行使其动态依赖于一个或另一个子项目。

这意味着,我不能拥有“发布版本”来使Web应用程序仅依赖于真正实现的模块,或者“存根构建”使Web应用程序仅依赖于同一项目树中的存根模块。

分离依赖关系的想法是:我不希望产品发布战争包括stubbed jar。存根罐只应在测试环境中可用。

问题:我可以使用命令行参数告诉SBT要依赖哪个子项目吗?

在正常码头启动项目时:启动时,主项目应该依赖于常规子项目。如果我用'-Stub = true'之类的命令行启动SBT,那么我希望主项目将依赖项更改为stubbed子项目。由于给出时间,它应该是存根模型或常规存根模型,编译器应该有机会更新依赖关系。是否可以在SBT中完成?

以下是一个示例项目:

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
)

运行SBT时,我们可以使用存根模型:

./sbt ~jetty:start -Stub = true

或常规模型

./sbt ~jetty:start

如果SBT不支持它,是否有可能像这样成为SBT的新功能?

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

1 个答案:

答案 0 :(得分:0)

很抱歉回答我自己的问题。在尝试了一些东西后,我找到了一些解决方法,我想在这里分享一下,这样对其他人来说可能会有所帮助。

我使用环境变量来动态控制项目链接,而不是使用命令行。

以下是项目配置的示例:

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

数据层仅定义了接口,然后LiveDataTier和StubDataTier为同一数据层执行两组实现。在webApp中,您不需要为依赖项进行任何切换,只需使用它就像只有一个依赖项目一样。

当需要在存根模型中运行时,请运行命令行:

export Stub=true

然后启动正常的SBT清理构建,然后WebApp项目将链接到StubDataTier

运行命令行:

export Stub=false

然后webApp将使用livedataTier作为依赖子项目。

默认情况下,它将是livingataTier作为依赖项。

这对我很有用。

注意:在两个依赖项之间切换时,应该进行干净的构建。