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

dpr*_*att 9 sbt

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

以下是两个有用的例子.

1)具有三个项目A,B和C的构建.A和B都是scala项目,并且在其设置中具有'scalaVersions ++ = Seq("2.11.2","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版本的源dirs设置为/ dev/null或类似的东西,但实际上仍然运行构建并产生一个空的工件.我知道我可能会进去找到所有相关的键并做类似的事情

publishArtifact := if(scalaBinaryVersion.value == "2.10") false else publishArtifact.value
Run Code Online (Sandbox Code Playgroud)

然后搜索所有其他相关的设置/任务(编译,在Test中编译,在Test中测试,packageBin等)但这看起来很糟糕.某处有"跳过"设置吗?

Eug*_*ota 5

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