【问题标题】:Cross-building only some of a multi-project sbt build仅交叉构建多项目 sbt 构建的一部分
【发布时间】:2013-11-07 23:10:11
【问题描述】:

有没有一种方法可以让我为多项目构建的不同部分获得不同的跨 scala 版本?这样做的动机是我将客户端和服务器库捆绑在一个构建中。客户端库需要同时支持 2.9 和 2.10,但我想在服务器中使用 2.10 特定的库和功能。

我们有一个 hacky 解决方法:

def forkSrcDirs(srcDirectory: File, scalaVer: String) = {
  val ver = scalaVer.split("\\.").take(2).mkString(".")
  Seq(srcDirectory / "scala-%s".format(ver), srcDirectory / "java-%s".format(ver))
}

lazy val forkSourceSettings = {
  seq(
    unmanagedSourceDirectories in Compile <++= (sourceDirectory in Compile, scalaVersion) apply forkSrcDirs,
    unmanagedSourceDirectories in Test <++= (sourceDirectory in Test, scalaVersion) apply forkSrcDirs
  )
}

这让我们可以通过将所有代码放在 server/src/main/scala-2.10 中来实现目标,但看起来这应该是我们可以直接通过 SBT 设置完成的事情。

【问题讨论】:

  • 我们有几个项目需要这种处理(至少在我们处于 2.9 和 2.10 的过渡期时,希望我们很快就会结束)。如果有内置方式,我很想知道。
  • 你的 SBT 版本是多少?

标签: scala sbt


【解决方案1】:

看起来sbt-cross plugin 正在提供您需要的东西。它会从单个项目定义中为您需要的每个 scala 版本生成一个 sbt 项目。

在 project/plugins.sbt 中,添加

resolvers += Resolver.sonatypeRepo("releases")

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

对于你给定的结构,你的 build.sbt 应该是这样的

lazy val root = (project in file("."))
  .aggregate(server, client_2_9, client_2_10)

lazy val server = (project in file("server"))
  .settings(
    scalaVersion := "2.10.6"
  )

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

lazy val client_2_9 = client("2.9.3")
lazy val client_2_10 = client("2.10.6")

【讨论】:

    【解决方案2】:

    在您的 Build.scala 中:

    //maybe you need to set your preferred scalaVersion
    import sbt._
    import Keys._
    
    object HelloBuild extends Build {
        lazy val root = Project(id = "main",
                                base = file(".")) aggregate(client, server)
    
        lazy val client = Project(id = "client", base = file("client")).settings(crossScalaVersions := Seq("2.9.2", "2.10.0"))
    
        lazy val server = Project(id = "server", base = file("server"))
    }
    

    要发布-本地(删除“-local”以进行真正的发布“):

    sbt "server/publish-local" "project client" "+ publish-local"
    

    文件夹结构如下:

    .
    ├── client
    │   └── src
    │       └── main
    │           └── scala
    │               └── Client.scala
    ├── project
    │   └── Build.scala
    └── server
        └── src
            └── main
                └── scala
                    └── Server.scala
    

    链接:

    【讨论】:

    • 我正在寻找与 sbt-release 插件配合得很好的东西。您的建议似乎违背了拥有聚合根项目的目的。
    • 那么请用所有相关信息更新您的问题。
    猜你喜欢
    • 2019-05-12
    • 2013-11-09
    • 2018-02-26
    • 2023-03-15
    • 2014-08-24
    • 2021-05-28
    • 2013-12-20
    • 2023-04-10
    • 2020-03-11
    相关资源
    最近更新 更多