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 插件的主要内容,如果未能解决你的问题,请参考以下文章

为多项目中的子项目指定不同版本的 sbt?

SBT将项目ID添加到多项目构建中的日志中

sbt 子项目的项目目录

如何让 SBT 跳过给定子项目的交叉编译?

sbt:子项目的动态聚合

如何通过将 sbt-plugin 用作多项目构建中的依赖项来访问它的子项目?