SBT:如何从一项聚合任务中排除一个子项目

Eli*_*lay 6 scala multi-project subproject sbt

我有一堆子项目,我定义如下(实际上由 a 生成project/meta.sbt):

lazy val Top = (project in file("."))
  .aggregate(common, p1, p2, tests, scripts)
  .dependsOn(common, p1, p2, tests, scripts)
lazy val common = project
lazy val p1 = project.dependsOn(common % "compile->compile;test->test")
lazy val p2 = project.dependsOn(common % "compile->compile;test->test")
lazy val tests = project.dependsOn(common % "compile->compile;test->test")
lazy val scripts = project
Run Code Online (Sandbox Code Playgroud)

AFAICT(所以也许这是错误的),顶部的aggregatedependsOn都有意义:第一个在所有子项目中运行任务,第二个方便调试东西。

现在,问题是它只tests包含一堆测试,并且scripts是一个用作发布步骤的脚本——所以我需要以某种方式使其避免仅为它们创建 jar 文件。我仍然希望compile/ test/etc 被聚合,包括它们。

我对文档的理解是,这应该通过aggregate在 中设置密钥来完成Top,并且实际上添加类似的内容

  .settings(aggregate in clean:= false)
Run Code Online (Sandbox Code Playgroud)

防止clean被聚合——但我想这样做,package并且不想完全放弃它,只是不打包这两个子项目。使用类似的东西aggregate in (tests, packageBin)是我最好的猜测,但这似乎并没有给 SBT 留下印象:看起来packageBin是错误的,而且将它与 结合起来也tests不起作用。

那可能吗?事实上,考虑到 SBT 只是稍微有点过度设计,它总是可能的,所以换句话说:我怎样才能做到这一点?

更新:

感谢这个答案,我找到了一个解决方法——添加:

.settings(Keys.`package` := file(""))
Run Code Online (Sandbox Code Playgroud)

不应打包的子项目的定义。这可以避免生成 jar 文件,但显然不是实际问题的答案(我可能会再次遇到这个问题)。