【问题标题】:How to have SBT subproject with multiple Scala versions?如何拥有具有多个 Scala 版本的 SBT 子项目?
【发布时间】:2015-11-27 07:19:29
【问题描述】:

我有一个使用 Scala 2.10 的项目和一个使用 Scala 2.11 的项目。它们依赖于一个通用项目,可以同时编译。

lazy val foo = (project in file("foo")).dependsOn(baz).settings(
  scalaVersion := "2.10.4"
)

lazy val bar = (project in file("bar")).dependsOn(baz).settings(
  scalaVersion := "2.11.4"
)

lazy val baz = (project in file("baz")).settings(
  crossScalaVersions := Seq("2.10.4", "2.11.4"),
  scalaVersion := "2.10.4"
)

然后

$ sbt bar/update
[info] Updating {file:/home/paul/Private/test/}bar...
[info] Resolving baz#baz_2.11;0.1-SNAPSHOT ...
[warn]  module not found: baz#baz_2.11;0.1-SNAPSHOT
[warn] ==== local: tried
[warn]   /home/paul/.ivy2/local/baz/baz_2.11/0.1-SNAPSHOT/ivys/ivy.xml
[warn] ==== public: tried
[warn]   http://repo1.maven.org/maven2/baz/baz_2.11/0.1-SNAPSHOT/baz_2.11-0.1-SNAPSHOT.pom
[info] Resolving jline#jline;2.12 ...
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: baz#baz_2.11;0.1-SNAPSHOT: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[trace] Stack trace suppressed: run last bar/*:update for the full output.
[error] (bar/*:update) sbt.ResolveException: unresolved dependency: baz#baz_2.11;0.1-SNAPSHOT: not found
[error] Total time: 1 s, completed Jan 13, 2015 11:42:51 AM

我怎样才能让两个项目都可以使用baz

【问题讨论】:

  • 您是否尝试过 crossPaths := false 选项来完全忽略 scala 版本?
  • 您可能会遇到一些可比性问题(不是 100%),但老实说,您的情况无论如何都很难闻;所以我建议这是一个临时修复,直到你让 foobaz 都使用 2.11.4。

标签: scala sbt sbt-0.13 cross-build


【解决方案1】:

Yevgeniy Mordovkin 提出的解决方案,在 baz 项目中声明 crossPaths := false 可行。

您可能会做的另一件事是在命令前添加+sbt '+ bar/update'。这将为所有声明的 Scala 版本构建 baz

【讨论】:

  • 谢谢。 (1) crossPaths 是否会导致问题,因为 Scala 次要版本不兼容二进制? (2) 看来+ 可以工作,我还需要将crossVersions 添加到bar,并用project bar+update 切换项目(而不是+bar/update ),否则使用 2.10。
  • @PaulDraper 无需将crossScalaVersions 添加到bar。你需要做的是在声明dependsOn之前设置settingslazy val bar = (project in file("bar")).settings(scalaVersion := "2.11.4").dependsOn(baz)
  • @PaulDraper 你可以在bar 中使用update 而没有前面的+,只要你已经为所有声明的版本编译了baz
  • @PaulDraper 是的,设置 crossPaths := false 可能会导致问题,所以你最好不要使用它。
  • @IonuțG.Stan 不幸的是,以同样的方式将settings 放在aggregate 之前似乎不起作用。预计会吗?见stackoverflow.com/questions/27231293/…github.com/scalan/scalan-ce/tree/include-lms-backend-in-root
【解决方案2】:

我为此创建了一个SBT plugin

project/plugins.sbt

resolvers += Resolver.sonatypeRepo("releases")

addSbtPlugin("com.lucidchart" % "sbt-cross" % "1.0")

build.sbt

lazy val foo = (project in file("foo")).dependsOn(baz_2_10).settings(
  scalaVersion := "2.10.4"
)

lazy val bar = (project in file("bar")).dependsOn(baz_2_11).settings(
  scalaVersion := "2.11.5"
)

lazy val baz = (project in file("baz")).cross

lazy val baz_2_10 = baz("2.10.4")

lazy val baz_2_11 = baz("2.11.5")

这需要多几行,但现在一切都按预期编译:sbt foo/compile 有效,sbt bar/compile 有效。

你不必记住独特的命令,你没有来自 crossPath := false 的错误,并且与 ++ 不同的是,这是可并行化的:sbt compile 将编译 foobar 和 @987654331 @ 同时使用正确的 Scala 版本。

【讨论】:

  • 不幸的是,它不能很好地与 Intellij 一起运行,但是当从 sbt 运行时 - 速度快而且很棒。
  • 适用于 IntellJ 2017.1.4
  • @Tvaroh 我认为它可以与 Intellij 一起使用,或者比任何其他解决方案都更好。如果您发现其他情况,请在 Github 项目上提交错误。
  • @PaulDraper 只有在所有模块都设置为交叉构建时才有效。如果是子集 - 它不会。
  • 它是否与发布包的工作流程配合得很好?
【解决方案3】:

我有一个类似的设置,并让它像这样工作:

lazy val baz = (project in file("baz")).settings(
  crossScalaVersions := Seq("2.10.4", "2.11.4")
)
lazy val bar = (project in file("bar")).dependsOn(baz).settings(
  scalaVersion := "2.10.4"
)
lazy val foo = (project in file("foo")).dependsOn(baz).settings(
  scalaVersion := "2.11.4"
)

和构建

sbt '++ 2.10.4 baz/compile' 'bar/compile' '++ 2.11.4 baz/compile' 'foo/compile'

【讨论】:

    猜你喜欢
    • 2016-08-27
    • 2011-02-22
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2015-04-25
    • 2020-06-08
    • 2018-08-06
    • 2015-01-27
    相关资源
    最近更新 更多