首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >基于命令行参数的SBT动态项目依赖

基于命令行参数的SBT动态项目依赖
EN

Stack Overflow用户
提问于 2017-09-30 18:22:18
回答 1查看 112关注 0票数 0

在SBT多项目中,主Web App依赖于一些子项目。当我考虑存根模型时,我想让存根模型实现成为一个单独的子项目。

问题: SBT项目依赖关系是在SBT中预定义的。我不能通过命令行将它动态地依赖于一个或另一个子项目。

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

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

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

在normal jetty:start上启动项目时,主项目应依赖于常规子项目。如果我用'-Stub = true‘这样的命令行启动SBT,那么我希望主项目将依赖项更改为存根子项目。由于给定时间,它应该在存根模型或常规存根模型中,编译器应该有机会更新依赖项。可以用SBT做吗?

下面是一个示例项目:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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时,我们可以做存根模型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./sbt ~jetty:start -Stub = true

或者在常规模型中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./sbt ~jetty:start

如果SBT不支持,有没有可能像这样成为SBT的新特性呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.dependsOn(
  if (getCmdLineArg("Stub") == "true") StubbedDataTier else DataTier
)
EN

回答 1

Stack Overflow用户

发布于 2017-10-03 03:57:07

很抱歉回答了我自己的问题。在尝试之后,我发现了一些解决办法,我想在这里分享它,以便它可能对其他人有帮助。

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

以下是项目配置示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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中,您不需要为依赖项设置任何开关,只需像只有一个依赖项项目一样使用它。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export Stub=true

然后开始正常的SBT干净构建,然后WebApp项目将链接到StubDataTier

通过运行命令行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export Stub=false

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

默认情况下,它将被livedataTier作为依赖项。

这对我来说很有用。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46505760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文