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

Scala 如何在多模块生成中禁用根聚合模块的打包和发布任务?,scala,sbt,Scala,Sbt,我有一个多项目SBT项目,看起来像SBT文档上的示例: 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",

我有一个多项目SBT项目,看起来像SBT文档上的示例:

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
只是一个聚合两个子项目的虚拟项目,所以我希望避免包生成(和工件发布),但仍然为两个子项目生成包(和发布)

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

事实上,这很容易。只需覆盖根项目中的
publish
设置:

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


为了避免发布子项目(根项目)build.sbt,以下内容对我有用(这也可用于其他子项目):


(sbt 0.12.2)

另一个选项是关闭源代码处的工件发布,而不是通过列出要禁用的特定任务来玩whac-a-mole(
publish
publish local
publish signed
,等等)

publishArtifact:=false
即使没有发布,我也发现我需要提供一个
publishTo
值,以使sbt pgp的
publish签名
任务满意。它需要这个值,即使它从不使用它

publishTo:=Some(Resolver.file(“未使用的临时存储库”,file(“target/unusedrepo”))

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

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

publishArtifact in root := false
是原始问题的项目定义


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

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

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

到相应的
项目
(根目录或非根目录)。这种方法的“怪异”是由于
packageBin
,&c.类型为
TaskKey[File]
。我成功地使用了这种技术(在根级别和中间聚合中)。

对于SBT1.x设置
publish:={}
对我不起作用。相反,您可以使用
发布/跳过

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

请参阅SBT的最新版本,其中包含跳过发布阶段的设置,如详细信息所示


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

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

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

它不起作用。至少当我尝试
publishlocal
时,它仍然为根项目构建/发布一个空jar。(我使用sbt 0.11.2)@paradigmatic是否覆盖了本地发布?您必须覆盖不希望在根上执行的任何步骤。我用一个包含两个子项目的空项目测试了它,就像在你的例子中一样,这确实阻止了发布在根上做任何事情。我也尝试了同样的例子,没有覆盖,它仍然为3个子项目发布工件。这真的很奇怪。我把样本放在了上面。执行
publish local
publish
显然只会为子项目做一些事情。对于SBT 1.0+请参见@diego-e-alonso-blas的答案。密钥的名称是
publish artifact
,但它仍然会创建并交付ivy.xml文件(至少在执行本地发布时)这是否也适用于非根项目?我不使用sbt pgp,但如果没有
publishTo
dummy设置,它仍然会失败;这与sbt 0.13.8一致。我认为这只是交叉构建时的一个问题,但我不确定。@mitchus我发现0.13.16中仍然存在同样的问题,即使没有交叉构建,也没有sbt pgp。这似乎是一个基本的sbt问题。查看
检查
相关性,
发布
取决于
发布配置
发布配置
取决于
发布到
。看起来如果
publishTo
None
则即使
publishArtifact
为false,它也会爆炸。这对publishSigned和publishLocalSigned不起作用-最好按照上面的回答关闭工件的发布。@Mikealen因为回答的顺序发生了变化,引用一个人的名字会比“上面”更好。这对我有效,而
publishArtifact:=false
仍然需要命名一个存储库。这对我也有效,而在根项目中使用
publishArtifact:=false
会导致使用
docker:publish
时出错,可能是因为
docker:publish
不尊重
publishArtifact
设置:
java.lang.IllegalStateException:Ivy文件未在缓存中找到…
(sbt版本1.1.1)这是sbt 1.0+的最佳答案。阿卡就是这样做的
lazy val root = (project in file("."))
  .settings(
    CustomSettings ++ Seq(
      Keys.`package` := { new File("") }
    )
  )
  .aggregate(blabla)