SBT 多项目构建:针对不同子项目的 2 个不同版本的 sbt play 插件
Posted
技术标签:
【中文标题】SBT 多项目构建:针对不同子项目的 2 个不同版本的 sbt play 插件【英文标题】:SBT multi-project build : 2 different versions of sbt play plugin for different subprojects 【发布时间】:2021-05-28 02:37:47 【问题描述】:我有一个 sbt
项目,其中包含 2 个 play 子项目和 2 个不同版本的 play(基本上是 2 个不同版本的 Scala:2.12 和 2.10)。有没有办法使用两个版本的播放插件?
这是我的plugins.sbt
:
resolvers += "Typesafe repository" at "https://repo.typesafe.com/typesafe/releases/"
resolvers += "scalaz-bintray" at "https://dl.bintray.com/scalaz/releases"
resolvers += "Akka Snapshot Repository" at "https://repo.akka.io/snapshots/"
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.8.7")
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.7")
这是build.sbt
:
lazy val global = Project("root",file("."))
lazy val play28 = Project( "play_2.8_subproject" , file("subs/ply28/")).settings(
libraryDependencies ++= Seq( jdbc , ehcache , ws , specs2 % Test , guice ),
scalaVersion := "2.12.2"
).enablePlugins(PlayScala)
lazy val play23 = Project( "play_2.3_subproject" , file("subs/pl23/")).settings(
scalaVersion := "2.10.5",
libraryDependencies ++= Seq( jdbc , ws )
).enablePlugins(PlayScala)
我可以运行 play 2.8 子项目。尽管如此,在尝试运行 play 2.3 项目时,Scala 2.10 仍然无法解决 play 插件 2.8。
(play_2.3_subproject/*:update) sbt.ResolveException:未解决的依赖: com.typesafe.play#play-server_2.10;2.8.7:未找到
你明白了,我想在两个 play 项目之间切换,并为每个子项目启用适当的插件版本。
首先这可能吗?如果是,我该如何实现所需的行为? 注意我使用的是 sbt 0.13。
【问题讨论】:
我认为提出这样的问题是停止使用 Scala 2.10 并升级到最新的 sbt 的好兆头。 @Tomer Shetah ,我想根据子项目继续使用 2.10 和 2.12 版本 我没有确凿的证据,但我很确定这是不可能的。即使是这样,这些版本之间也存在重大变化。你打算如何编写对双方都有利的代码?例如,请参见此处:playframework.com/documentation/2.8.x/Migration26。你想达到什么目的?为什么要同时使用这两个版本? @Tomer Shetah ,我已经有 play 2.3 子项目工作,我想添加一个新的 play 2.8 子项目,而不涉及旧的 play 子项目。乍一看,我认为不会有问题,因为每个子项目都有自己的设置;直到我被插件的东西卡住了,我不能在 plugins.sbt 中有两个不同版本的 play 插件。如果我尝试运行旧的播放项目 (2.3) ,sbt 会尝试使用 scala 2.10 检索播放 2.8 插件,这会导致未解决的依赖异常。 是的,正如我所说,我认为这是不可能的。但是,如果您使用 git,它会保存您的历史记录,因此您不需要同时拥有两者,您可以安全地升级到最新版本并只使用它们。 【参考方案1】:总结 cmets 的讨论,这可能是不可能的。例如,困难之一是在build.sbt
中启用PlayScala
。如The /build.sbt
file (version 2.8) 或Auto Plugins and plugin settings (version 2.3) 中所述,在这两个版本中,您都启用了插件:
lazy val root = (project in file(".")).enablePlugins(PlayScala)
当PlayScala
在两个版本中定义为play.sbt.PlayScala
时。
话虽如此,即使可以构建这样的结构,也很难维护,因为 Play 2.3 和 Play 2.8 之间存在重大变化,详细说明如下:
Play 2.4 Migration Guide Play 2.5 Migration Guide Play 2.6 Migration Guide Play 2.7 Migration Guide Play 2.8 Migration Guide升级 Play 版本的最佳方法是一次性完成。一次将 Scala、Play 和 sbt 升级到最新版本。搞清楚如何在同一个项目中同时拥有两个 Play 版本可能会花费更少的时间。
对于未来的维护,最好是在新版本发布后进行升级。这样你就不必做太多的改变来保持它。此外,您还可以获得最新的更新,其中通常包括安全漏洞修复、性能改进和错误修复以及新功能。
【讨论】:
以上是关于SBT 多项目构建:针对不同子项目的 2 个不同版本的 sbt play 插件的主要内容,如果未能解决你的问题,请参考以下文章