在SBT多项目中,主Web App依赖于一些子项目。当我考虑存根模型时,我想让存根模型实现成为一个单独的子项目。
问题: SBT项目依赖关系是在SBT中预定义的。我不能通过命令行将它动态地依赖于一个或另一个子项目。
这意味着,我不能使用“发布版本”来使web应用程序仅依赖于真正实现的模块,也不能使用“存根构建”来使web应用程序仅依赖于同一项目树中的存根模块。
分离依赖关系的想法是:我不想让产品发布战包括存根jar。存根jar应该只在测试环境中可用。
问:我是否可以使用命令行参数来告诉SBT要依赖哪个子项目?
在normal 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时,我们可以做存根模型:
./sbt ~jetty:start -Stub = true
或者在常规模型中
./sbt ~jetty:start
如果SBT不支持,有没有可能像这样成为SBT的新特性呢?
.dependsOn(
if (getCmdLineArg("Stub") == "true") StubbedDataTier else DataTier
)
发布于 2017-10-03 03:57:07
很抱歉回答了我自己的问题。在尝试之后,我发现了一些解决办法,我想在这里分享它,以便它可能对其他人有帮助。
我使用环境变量来动态控制项目链接,而不是使用命令行。
以下是项目配置示例:
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作为依赖子项目。
默认情况下,它将被livedataTier作为依赖项。
这对我来说很有用。
注意:在两个依赖项之间切换时,您应该进行干净的构建。
https://stackoverflow.com/questions/46505760
复制相似问题