【问题标题】:How to disable package and publish tasks for root aggregate module in multi-module build?如何在多模块构建中禁用根聚合模块的打包和发布任务?
【发布时间】:2012-02-05 21:16:59
【问题描述】:

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

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

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    不是通过列出要禁用的特定任务(publishpublish-localpublish-signed 等)来玩 whac-a-mole,另一种选择是在源头关闭工件发布。

    publishArtifact := false
    

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

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

    【讨论】:

    • 密钥的名称是publishArtifact
    • 虽然它可以工作,但它仍然会创建并提供 ivy.xml 文件(至少在本地发布时)
    • 这应该也适用于非根项目吗?
    • 我没有使用sbt-pgp,但是如果没有publishTo dummy 设置还是会失败;这是 sbt 0.13.8。我认为这只是交叉构建时的问题,但我不确定。
    • @mitchus 我发现即使没有交叉构建,也没有 sbt-pgp,在 0.13.16 中也是如此。似乎是一个基本的 sbt 问题。查看inspect 依赖关系,publish 依赖于publishConfigurationpublishConfiguration 依赖于publishTo。看起来如果 publishToNone 它最终会爆炸,即使 publishArtifact 是假的。
    【解决方案2】:

    其实, 很简单。只需覆盖根项目中publish 的设置即可:

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

    【讨论】:

    • 它不起作用。至少当我尝试publish-local 时,它仍然会为根项目构建/发布一个空 jar。 (我使用 sbt 0.11.2)
    • @paradigmatic 您是否覆盖了本地发布?您必须覆盖您不想在根目录上执行的任何步骤。我确实用一个包含两个子项目的空项目来测试它,就像你的例子一样,这确实阻止了发布在根目录上做任何事情。
    • 我也尝试了这个没有覆盖的相同示例,它仍然为 3 个子项目发布工件。这真的很奇怪。
    • 我将示例构建放在github 上。做publish-localpublish 显然只为子项目做事。
    • 对于 SBT 1.0+,请参阅@diego-e-alonso-blas 的答案。
    【解决方案3】:

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

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

    (sbt 0.12.2)

    【讨论】:

    • 这不适用于 publishSigned 和 publishLocalSigned - 最好按照上面的答案关闭工件的发布。
    • @MikeAllen 因为答案的顺序发生了变化,所以提到一个人的名字会比“上面”更好。
    • 这对我有用,而 publishArtifact := false 仍然需要命名存储库。
    • 这对我也有用,而在根项目中使用 docker:publish 时使用 publishArtifact := false 会导致错误,可能是因为 docker:publish 不尊重 publishArtifact 设置:java.lang.IllegalStateException: Ivy file not found in cache for ... ( sbt 版本 1.1.1)
    【解决方案4】:

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

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

    publishArtifact in root := false
    

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

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

    【讨论】:

      【解决方案5】:

      最新版本的 SBT 包括一个跳过发布阶段的设置,详细信息 here

      publish / skip := true
      

      【讨论】:

      【解决方案6】:

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

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

      到对应的Project(root 与否)。这种方法的“怪异”是由于packageBin 等属于TaskKey[File] 类型。我成功地使用了这种技术(在根级别和中间聚合中)。

      【讨论】:

        【解决方案7】:

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

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

        https://github.com/sbt/sbt/issues/3136

        【讨论】:

          【解决方案8】:

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

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

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

          【讨论】:

            【解决方案9】:

            添加

            publish := false
            

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

            【讨论】:

              猜你喜欢
              • 2015-02-22
              • 1970-01-01
              • 2012-10-15
              • 1970-01-01
              • 1970-01-01
              • 2014-10-30
              • 2012-10-02
              • 1970-01-01
              • 2012-05-06
              相关资源
              最近更新 更多