2

我在 SBT 中构建了一个多项目 Scala,其中我有一个根项目,它实际上只是聚合了两个子项目:一个宏库和一个使用该宏库的核心库。

我正在使用出色的插件为整个库(宏 + 核心相结合)sbt-unidoc创建一个统一的 API。scaladoc

不幸的是,sbt-unidoc有一些限制。例如,默认情况下,它不会挂接到doc任务中,并且其输出放置在目标目录的unidoc文件夹中,而不是api文件夹中。publish结合起来,这些可以防止在执行orpublishLocal命令时生成和打包生成的文档。幸运的是(感谢GitHub网站上提出的问题),有一个简单的解决方案:inkytonicsbt-unidoc

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项目将为两个子项目生成统一文档,并且该统一文档在发布期间被打包。

不幸的是,这些相同的命令还尝试为子项目macrocore子项目生成单独的子项目 API 文档——在我的特定情况下,由于各种原因,这些命令将失败。更不用说生成两次文档需要时间。

所以,这是我的问题:有什么简单的方法可以禁用doc每个子项目的任务吗?

到目前为止,我能够发现的唯一方法是欺骗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

1 回答 1

6

您可以准确地说出您想要聚合的内容。在这种情况下

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

应该工作,我相信。

于 2014-05-30T09:48:45.300 回答