【发布时间】:2014-10-25 03:11:00
【问题描述】:
我遇到了几个与 SBT 相关的案例,这让我很困惑。有没有办法告诉 SBT 在交叉编译时完全跳过某些 scala 版本的子项目?
这里有两个有用的例子。
1) 包含三个项目 A、B 和 C 的构建。A 和 B 都是 scala 项目,并且在其设置中具有 'scalaVersions ++= Seq("2.11.2", "2.10.4")。项目 C 是一个纯 Java 工件,因此我已将 Scala 库从它的依赖项中排除。我希望 A 和 B 依赖于 C,但理想情况下我只想构建 C 一次。如果我使用默认行为并从根聚合器项目中执行“+publish”,我会生成两个 C-1.0.0.jar 副本,并且 SBT 尝试发布它两次,这对于Maven 仓库。
2) 包含多个 Scala 项目的构建,但其中一个项目应该只针对单个 Scala 版本构建。我已经尝试在该项目的设置中定义“scalaVersions”以仅保存一个版本,而其他项目有两个,但来自根聚合器的“+publish”再次似乎忽略了这一点,仍然编译两次,第二次失败,因为它的依赖项不适用于该 Scala 版本。这个项目是依赖图中的一个叶子节点,所以在逻辑上想要做这件事是一件非常好的事情。
对于案例 #2,我曾考虑将“坏”scala 版本的源目录设置为 /dev/null 或类似的东西,但实际上仍会运行构建并产生一个空工件。我知道我可能会进入并找到所有相关的密钥并执行类似的操作
publishArtifact := if(scalaBinaryVersion.value == "2.10") false else publishArtifact.value
然后查找所有其他相关设置/任务(编译、在 Test 中编译、在 Test 中测试、packageBin 等),但这似乎很 hack-ish。某处是否有“跳过”设置?
【问题讨论】:
标签: sbt