我遇到了一些与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等),但这看起来很糟糕。是否有跳过'设置在某个地方?
答案 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
。