如何在多模块构建中禁用根聚合模块的打包和发布任务?

时间:2012-01-09 10:06:12

标签: scala sbt

我有一个多项目SBT项目,看起来像SBT doc上的例子:

import sbt._
import Keys._

object HelloBuild extends Build {
  lazy val root = Project(id = "hello",
                        base = file(".")) aggregate(foo, bar)

  lazy val foo = Project(id = "hello-foo",
                       base = file("foo"))

  lazy val bar = Project(id = "hello-bar",
                       base = file("bar"))
}

因为root只是一个聚合两个子项目的虚拟项目,我想避免包生成(和工件发布),但仍然为两个子项目生成包(和发布)。

有没有简单的方法来实现它?

9 个答案:

答案 0 :(得分:53)

通过列出要禁用的特定任务(publishpublish-localpublish-signed等),而不是播放whac-a-mole,另一个选项是关闭源上的工件发布

publishArtifact := false

即使没有发布发布,我还发现我需要提供publishTo值才能让sbt-pgp的publish-signed任务满意。它需要这个值,即使它从不使用它。

publishTo := Some(Resolver.file("Unused transient repository", file("target/unusedrepo")))

答案 1 :(得分:29)

实际上, 非常简单。只需覆盖根项目中publish的设置:

base = file(".")) settings (publish := { }) aggregate(foo, bar)

答案 2 :(得分:9)

以下对我有用(这也可用于其他子项目):

lazy val root = Project(
  id = "root",
  base = file("."),
  aggregate = Seq(foo, bar),
  settings = Project.defaultSettings ++ Seq(
    publishLocal := {},
    publish := {}
  )
)

(sbt 0.12.2)

答案 3 :(得分:6)

最好使用 publishArtifact 设置。它适用于所有可能的发布方式,因为它们都依赖于此设置。

如果您需要关闭某个项目中的发布,可以通过提供项目名称来实现:

publishArtifact in root := false

root 是原始问题中的项目定义。

在定义项目后,您可以将此行放在 build.sbt 的任意位置。

答案 4 :(得分:3)

要禁用与程序包相关的任务,请添加

settings(packageBin := { new File("") }, 
         packageSrc := { new File("") }, 
         packageDoc := { new File("") })

到相应的Project(根或不)。 "古怪"这种方法的原因是packageBin,& c。属于TaskKey[File]类型。我成功地使用了这种技术(在根级别和中间聚合中)。

答案 5 :(得分:3)

对于sbt 1.x设置publish := { }对我不起作用。相反,您可以使用skip in publish

base = file(".")) settings (skip in publish := true) aggregate(foo, bar)

请参阅https://github.com/sbt/sbt/issues/3136

答案 6 :(得分:1)

SBT的最新版本包括一个跳过发布阶段的设置,如here所述。

skip in publish := true

答案 7 :(得分:0)

我正在使用sbt 1.3,并且尝试了已经提出的不同解决方案。我当前的设置是标准的多模块sbt项目:

lazy val root = (project in file("."))
  .settings(
    CustomSettings ++ Seq(
      Keys.`package` := { new File("") }
    )
  )
  .aggregate(blabla)

这是唯一在调用“ sbt软件包”时不生成空(根)jar的解决方案。请注意,这仅部分涵盖了问题(也涉及发布任务)。如果您像我一样只需要包装,那就足够了。

答案 8 :(得分:-4)

添加

publish := false

到子项目(根项目)build.sbt以避免发布