2014-05-29 5 views
1

У меня есть многопроектная сборка Scala в SBT, в которой у меня есть корневой проект, который эффективно просто объединяет два подпроекта: библиотеку макросов и основную библиотеку, которая использует эту библиотеку макросов.Отключить создание дочернего подпроекта sbt

Я использую отличный плагин sbt-unidoc, чтобы создать единый унифицированный API scaladoc для всей библиотеки (макро + ядро ​​в сочетании).

К сожалению, sbt-unidoc имеет некоторые ограничения. Например, по умолчанию он не подключается к задаче doc, а ее вывод помещается в папку unidoc целевого каталога, а не в папку api. В сочетании они предотвращают создание и упаковку результирующей документации при выполнении команд или publishLocal. К счастью (и благодаря an issue поднятый inkytonic на сайте sbt-unidocGitHub), есть простое решение этой проблемы:

lazy val customUnidocSettings = unidocSettings ++ Seq (
    doc in Compile := (doc in ScalaUnidoc).value, 
    target in unidoc in ScalaUnidoc := crossTarget.value/"api" 
) 

Эти параметры затем используются в корневом проекте:

lazy val macro = (project in file ("macro")). 
    settings (
    name = "foo-macro" 
) 

lazy val core = (project in file ("core")). 
    settings (
    name = "foo-core" 
). 
    dependsOn (macro) 

lazy val root = (project in file (".")). 
    settings (customUnidocSettings: _*). 
    settings (
    name = "foo" 
). 
    aggregate (macro, core) 

сейчас , если вы выполняете задачи sbt doc, publish, publishLocal и т. д. проект root будет генерировать единую документацию для двух подпроектов и что унифицированная документация будет упакована во время публикации катион.

К сожалению, эти же команды также пытаются сгенерировать отдельную документацию API подпроекта для подпроектов macro и core - и по разным причинам в моем конкретном случае они не сработают. Не говоря уже о том, что для создания документации требуется время.

Итак, вот мой вопрос: существует ли какой-либо простой способ отключить задачу для каждого подпроекта?

Единственный подход, который я смог обнаружить до сих пор, заключается в том, чтобы обмануть doc, подумав, что нет файлов со встроенным Scaladoc. Это работает, но это скорее выдумка, чем реальное решение:

lazy val noDocFileSettings = Seq (
    sources in doc in Compile := List() 
) 

lazy val macro = (project in file ("macro")). 
    settings (noDocFileSettings: _*). 
    settings (
    name = "foo-macro" 
) 

lazy val core = (project in file ("core")). 
    settings (noDocFileSettings: _*). 
    settings (
    name = "foo-core" 
). 
    dependsOn (macro) 

Любые предложения?

ответ

4

Вы можете сказать exactly what you want to aggregate. В этом случае

lazy val root = (project in file (".")). 
    settings (customUnidocSettings: _*). 
    settings (
    name = "foo", 
    aggregate in doc := false 
). 
    aggregate (macro, core) 

должно работать, я считаю.

+0

Отлично - он отлично работает! Спасибо, что указали это, и ссылку на документацию. –

Смежные вопросы