【问题标题】:SBT dynamic project dependency based on command line argument基于命令行参数的 SBT 动态项目依赖
【发布时间】:2018-03-12 08:36:24
【问题描述】:

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

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

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

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

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

在正常的jetty:start启动项目时,它的主项目应该依赖于常规的子项目。如果我使用“-Stub = true”之类的命令行启动 SBT,那么我希望主项目将依赖项更改为存根子项目。由于给定时间,它应该在存根模型或常规存根模型中,编译器应该有机会更新依赖关系。是否可以在 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 时,我们可以做 stubbed 模型:

./sbt ~jetty:start -Stub = true

或在常规模型中

./sbt ~jetty:start

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

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

【问题讨论】:

    标签: dependencies sbt projects


    【解决方案1】:

    很抱歉回答我自己的问题。在尝试了一些东西之后,我找到了一些解决方法,我想在这里分享它,以便对其他人有所帮助。

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

    以下是项目配置示例:

    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 clean build,然后 WebApp 项目将链接到 StubDataTier

    通过运行命令行:

    export Stub=false
    

    那么webApp会使用livedataTier作为依赖子项目。

    默认是livedataTier作为依赖。

    这对我很有用。

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

    【讨论】:

      猜你喜欢
      • 2018-03-20
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 2020-01-23
      • 2011-08-27
      相关资源
      最近更新 更多