我有一个多项目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
只是一个聚合两个子项目的虚拟项目,我想避免包生成(和工件发布),但仍然为两个子项目生成包(和发布)。
有没有简单的方法来实现它?
答案 0 :(得分:53)
通过列出要禁用的特定任务(publish
,publish-local
,publish-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)
答案 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以避免发布