【发布时间】:2014-05-30 17:48:45
【问题描述】:
我在 SBT 中有一个多项目 Scala 构建,其中我有一个根项目,它实际上只是聚合了两个子项目:一个宏库和一个使用该宏库的核心库。
我正在使用出色的 sbt-unidoc 插件为整个库(宏 + 核心相结合)创建一个统一的 scaladoc API。
很遗憾,sbt-unidoc 有一些限制。例如,默认情况下,它不会挂接到doc 任务,并且它的输出放置在目标目录的unidoc 文件夹中,而不是api 文件夹中。结合起来,这些可以防止在执行publish 或publishLocal 命令时生成和打包生成的文档。幸运的是(感谢inkytonic 在sbt-unidoc GitHub 网站上提出的an issue),有一个简单的解决方案:
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 项目将为两个子项目生成统一文档,并且该统一文档在发布期间打包。
不幸的是,这些相同的命令还尝试为 macro 和 core 子项目生成单独的子项目 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)
有什么建议吗?
【问题讨论】: