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

时间:2014-08-31 21:37:20

标签: sbt

我遇到了一些与SBT相关的案件让我感到难过。有没有办法告诉SBT在您进行交叉编译时完全跳过某个子项目?

以下是两个有用的例子。

1)包含三个项目A,B和C的构建.A和B都是scala项目,并且有scalaVersions ++ = Seq(" 2.11.2",&# 34; 2.10.4")在他们的设置中。 Project C是一个纯Java工件,因此我将Scala库从它的依赖项中排除。我希望A和B依赖于C,但理想情况下我只想建立一次C。如果我使用默认行为并执行" +发布"从根聚合器项目中,我得到了两个C-1.0.0.jar副本,并且SBT尝试将其发布两次,这对于maven存储库来说当然是禁忌。

2)具有多个scala项目的构建,但是一个项目应该仅针对单个Scala版本构建。我试过定义“scalaVersions”'在此项目的设置中只保留一个版本,其他项目有两个版本,但再次" +发布"从根聚合器似乎忽略了这一点并仍然编译两次,第二次失败,因为它的依赖关系不适用于该Scala版本。这个项目是依赖图中的一个叶子节点,所以想要逻辑地完成它是一件非常好的事情。

对于案例#2,我已经考虑过设置“坏”的源头目录。 scala版本到/ dev / null或类似的东西,但它仍然实际运行构建并产生一个空的工件。我知道我可能会进入并找到所有相关的键并执行类似

的操作
publishArtifact := if(scalaBinaryVersion.value == "2.10") false else publishArtifact.value

然后搜索所有其他相关设置/任务(编译,在Test中编译,在Test中测试,packageBin等),但这看起来很糟糕。是否有跳过'设置在某个地方?

2 个答案:

答案 0 :(得分:5)

我写了sbt-doge来解决跨子项目的任务聚合问题,这些子项目尊重他们的crossScalaVersions。对于Java项目,您可能需要一个虚拟crossScalaVersion条目。

答案 1 :(得分:1)

插件sbt-doge可用于在每个子项目中指定crossScalaVersion设置。

首先,将行addSbtPlugin("com.eed3si9n" % "sbt-doge" % "0.1.5")添加到projects/plugins.sbt

为了避免荒谬的doge语法(“这样的编译”,真的吗?),你需要在根项目中enablePlugins(CrossPerProjectPlugin)。有了这个,你可以在你的sbt命令之前添加一个加号,他们将尊重交叉构建设置。就像这样:+ compile