SBT 多项目构建:针对不同子项目的 2 个不同版本的 sbt play 插件
SBT multi-project build : 2 different versions of sbt play plugin for different subprojects
我有一个 sbt
项目,其中包含 2 个播放子项目和 2 个不同版本的播放(基本上是 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 项目时,play plugin 2.8 仍然没有用 Scala 2.10 解决。
(play_2.3_subproject/*:update) sbt.ResolveException: unresolved dependency:
com.typesafe.play#play-server_2.10;2.8.7: not found
你明白了,我想在两个播放项目之间切换,并为每个子项目启用合适的插件版本。
首先这可能吗?如果是,我怎样才能实现所需的行为?
注意我使用的是 sbt 0.13.
从评论中总结讨论,大概是不可能的。例如,困难之一是在 build.sbt
中启用 PlayScala
。如 The /build.sbt
file (version 2.8) or at Auto Plugins and plugin settings (version 2.3) 中所述,在两个版本中都启用插件:
lazy val root = (project in file(".")).enablePlugins(PlayScala)
当在两个版本中 play.sbt.PlayScala
定义了 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 个播放子项目和 2 个不同版本的播放(基本上是 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 项目时,play plugin 2.8 仍然没有用 Scala 2.10 解决。
(play_2.3_subproject/*:update) sbt.ResolveException: unresolved dependency: com.typesafe.play#play-server_2.10;2.8.7: not found
你明白了,我想在两个播放项目之间切换,并为每个子项目启用合适的插件版本。
首先这可能吗?如果是,我怎样才能实现所需的行为? 注意我使用的是 sbt 0.13.
从评论中总结讨论,大概是不可能的。例如,困难之一是在 build.sbt
中启用 PlayScala
。如 The /build.sbt
file (version 2.8) or at Auto Plugins and plugin settings (version 2.3) 中所述,在两个版本中都启用插件:
lazy val root = (project in file(".")).enablePlugins(PlayScala)
当在两个版本中 play.sbt.PlayScala
定义了 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 版本可能会花费更少的时间。
为了将来的维护,最好是在有新版本时升级。这样你就不必做太多的改变来保持它。此外,您可以获得最新的更新,其中通常包括安全漏洞修复、性能改进和错误修复,以及新功能。