Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Вместо того, чтобы играть 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")))

Ответ 3

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

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

(sbt 0.12.2)

Ответ 4

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

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

publishArtifact in root := false

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

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

Ответ 5

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

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

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

Ответ 6

Добавить

publish := false

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