如何让 SBT 子项目具有多个 Scala 版本?
How to have SBT subproject with multiple Scala versions?
我有一个使用 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
?
Yevgeniy Mordovkin 提出的解决方案,在 baz 项目中声明 crossPaths := false
,有效。
您可能会做的另一件事是在命令前添加 +
:sbt '+ bar/update'
。这将为所有已声明的 Scala 版本构建 baz。
我有一个类似的设置,并且是这样工作的:
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'
我为此创建了一个 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
将编译 [=17] =]、bar
和 baz
同时使用正确的 Scala 版本。
我有一个使用 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
?
Yevgeniy Mordovkin 提出的解决方案,在 baz 项目中声明 crossPaths := false
,有效。
您可能会做的另一件事是在命令前添加 +
:sbt '+ bar/update'
。这将为所有已声明的 Scala 版本构建 baz。
我有一个类似的设置,并且是这样工作的:
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'
我为此创建了一个 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
将编译 [=17] =]、bar
和 baz
同时使用正确的 Scala 版本。