Как отключить пакет и публиковать задачи для корневого агрегатного модуля в многомодульной сборке? - PullRequest
37 голосов
/ 09 января 2012

У меня есть мультипроектный 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 - это просто виртуальный проект для объединения обоих подпроектов, я бы хотел избежать генерации пакетов (и публикации артефактов), но все же генерировать пакеты (и публиковать) для обоих подпроектов.

Есть ли простой способ добиться этого?

Ответы [ 8 ]

53 голосов
/ 30 августа 2013

Вместо того, чтобы играть в whac-a-mole, перечисляя конкретные задачи для отключения (publish, publish-local, publish-signed и т. Д.), Другой вариант - отключить публикацию артефактов в источнике.

publishArtifact := false

Несмотря на то, что публикация не происходит, я также обнаружил, что мне нужно указать значение publishTo, чтобы выполнить задачу sbt-pgp publish-signed.Ему нужно это значение, даже если оно никогда не использует его.

publishTo := Some(Resolver.file("Unused transient repository", file("target/unusedrepo")))
29 голосов
/ 09 января 2012

На самом деле, это довольно просто.Просто измените настройку для publish в корневом проекте:

base = file(".")) settings (publish := { }) aggregate(foo, bar)
9 голосов
/ 08 февраля 2013

Следующее работает для меня (это также может быть использовано в других подпроектах):

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

(sbt 0.12.2)

6 голосов
/ 06 мая 2016

Лучше использовать настройку publishArtifact . Он работает для всех возможных способов публикации, поскольку все они зависят от этого параметра.

Если вам нужно отключить публикацию в определенном проекте, вы можете сделать это, указав имя проекта:

publishArtifact in root := false

Там root - это определение проекта из исходного вопроса.

Вы можете поместить эту строку в любом месте в build.sbt после определения проектов.

3 голосов
/ 22 мая 2018

Для настройки sbt 1.x publish := { } у меня не сработало.Вместо этого вы можете использовать skip in publish:

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

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

3 голосов
/ 24 сентября 2016

Чтобы отключить задачи, связанные с пакетом, добавьте

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

до соответствующего Project (корень или нет). «Странность» этого подхода в том, что packageBin и т. Д. Имеют тип TaskKey[File]. Я успешно использую эту технику (на корневом уровне и в промежуточной агрегации).

1 голос
/ 05 марта 2019

Последние версии SBT включают настройку для пропуска фазы публикации, как подробно здесь .

skip in publish := true
0 голосов
/ 07 февраля 2012

Добавьте

publish := false

в подпроект (корневой проект) build.sbt, чтобы избежать публикации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...